Некоторые компиляторы поддерживают расширения C++, позволяющие динамически выделять память в стеке. Например, g++
поддерживает alloca()
, а также VLA. Все эти расширения поставляются с оговоркой, что динамически выделяемая память «освобождается» в конце области действия вызывающей функции. (Редактировать: чтобы уточнить, я использую кавычки вокруг «освобожденного», потому что на самом деле происходит то, что компилятор уменьшает/увеличивает указатель стека, поэтому alloca()
требует поддержки компилятора.) Это означает, что память, выделенная с использованием alloca()
в конструкторе класса освобождается, как только конструктор возвращается.
С этим ограничением трудно справиться в классах, где конструктор выполняет некоторые нетривиальные шаги, чтобы определить, сколько памяти нужно выделить. Пользователь класса должен выделить память в функции, из которой создан класс, раскрывая некоторые внутренние компоненты, которые, возможно, не должны быть раскрыты. Более того, включение в мой код обходных путей для использования alloca()
или VLA, как правило, неудобно.
Можете ли вы придумать какой-нибудь способ обойти это ограничение, чтобы я мог использовать alloca()
, VLA или какое-либо другое языковое расширение, чтобы память могла быть выделена внутри класса и иметь область класса?