15 c++ stack new-operator
有没有办法使用new
关键字在堆栈(ala alloca
)而不是堆(malloc
)上分配?
我知道我可以自己破解但是我不愿意.
Jef*_*tin 23
要在堆栈上分配,可以按值将对象声明为局部变量,或者实际上可以使用alloca获取指针,然后使用就地新运算符:
void *p = alloca(sizeof(Whatever));
new (p) Whatever(constructorArguments);
Run Code Online (Sandbox Code Playgroud)
但是,在使用alloca和in-new时,确保在返回时释放内存,您放弃自动析构函数调用.如果您只是想确保在退出作用域时释放内存,请考虑使用std::auto_ptr<T>
或其他一些智能指针类型.
der*_*ert 12
Jeffrey Hantin非常正确,你可以使用placement new在stacka上创建它.但是,说真的,为什么?!相反,只需:
class C { /* ... */ };
void func() {
C var;
C *ptr = &var;
// do whatever with ptr
}
Run Code Online (Sandbox Code Playgroud)
您现在有一个指向堆栈上分配的对象的指针.而且,当你的函数存在时它会被正确地销毁.
你可以这样做:
Whatever* aWhatever = new ( alloca(sizeof(Whatever)) ) Whatever;
Run Code Online (Sandbox Code Playgroud)
您可以使用RAII类来进行我认为的破坏(编辑:另请参阅此其他答案以获取有关此方法的潜在问题的更多信息):
template <class TYPE>
class RAII
{
public:
explicit RAII( TYPE* p ) : ptr(p) {}
~RAII() { ptr->~TYPE(); }
TYPE& operator*() const { return *ptr; }
private:
TYPE* ptr;
}
void example()
{
RAII<Whatever> ptr = new ( alloca(sizeof(Whatever)) ) Whatever;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用宏来隐藏alloca.
关心DaveF