В 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;
}
person
Martin York
schedule
14.12.2018
alloca()
не является частью стандарта С++, я не думаю, что есть какие-либо гарантии. Если вы не используете какую-либо базовую библиотеку C, вам не следует использоватьmalloc()
илиalloca()
, а использовать интеллектуальные указатели. Умные указатели обеспечат автоматическую сборку мусора объекта и будут безопасными для исключений. - person Martin York   schedule 14.12.2018alloca()
:The alloca() function is machine- and compiler-dependent.
Так что я не думаю, что вы можете что-то гарантировать. Но в документах говорится, что пространство выделяется в кадре стека. Это означает, что когда функция возвращает значение, оно должно быть освобождено. НО деструктор не будет вызываться в этих ситуациях, поэтому, если объект использует внутреннее управление памятью, это пространство не будет правильно освобождено. - person Martin York   schedule 14.12.2018alloca
определенно не работает как сборщик мусора JVM. Прочтите также руководство по GC - person Basile Starynkevitch   schedule 14.12.2018