В C ++ вы не должны использовать процедуры управления памятью C.В современном C ++ интеллектуальные указатели предоставляют вам мелкозернистую детерминированную сборку мусора.
Хотя пространство, выделенное с помощью alloca()
, вероятно, освобождается от исключений (потому что это обычно делается путем увеличения размера текущего кадра стека),Это не является частью стандарта, и поэтому я не думаю, что вы можете дать какие-либо гарантии.
НО Это также означает, что любые соответствующие деструкторы на объекте никогда не будут вызываться.Это означает, что если объект выполняет свое собственное управление памятью, он не будет очищен (поскольку деструктор не запускается для его очистки).
Хотя alloca()
, вероятно, очень быстро.Я думаю, что дополнительная нагрузка на управление памятью (в общем случае) не стоит;хотя, если у вас есть особая потребность в дополнительной скорости, это может стоить.
Код выглядит так:
void func()
{
MyType* x = (MyType*)alloca(sizeof(MyType));
passXtoCFunctionThatDoesNotTakeOwnership(x);
}
Должно быть написано так:
void func()
{
std::unique_ptr<MyType> x = std::make_unique<MyType>();
passXtoCFunctionThatDoesNotTakeOwnership(x.get());
}
Если вы используете его для хранения массива объектов.
void func()
{
MyType* x = (MyType*)alloca(sizeof(MyType) * arraySize);
// STUFF
x[0].stuff();
}
Тогда лучше использовать std :: vector
void func()
{
std::vector<MyType> x;
x.reserve(arraySize); // or resize() if that is appropriate
// STUFF
x[0].stuff();
}
Если вы используете его для простогообъекты.Тогда вам, вероятно, следует просто объявить автоматические переменные:
void func()
{
MyType* x = (MyType*)alloca(sizeof(MyType));
x->myData = 5;
}
Вы должны просто объявить переменную:
void func()
{
MyType x;
x.myData = 5;
}