当前位置:  开发笔记 > 编程语言 > 正文

堆栈而不是堆的新东西(比如alloca vs malloc)

如何解决《堆栈而不是堆的新东西(比如allocavsmalloc)》经验,为你挑选了3个好方法。

有没有办法使用new关键字在堆栈(ala alloca)而不是堆(malloc)上分配?

我知道我可以自己破解但是我不愿意.



1> Jeffrey Hant..:

要在堆栈上分配,可以按值将对象声明为局部变量,或者实际上可以使用alloca获取指针,然后使用就地新运算符:

void *p = alloca(sizeof(Whatever));
new (p) Whatever(constructorArguments);

但是,在使用alloca和in-new时,确保在返回时释放内存,您放弃自动析构函数调用.如果您只是想确保在退出作用域时释放内存,请考虑使用std::auto_ptr或其他一些智能指针类型.



2> derobert..:

Jeffrey Hantin非常正确,你可以使用placement new在stacka上创建它.但是,说真的,为什么?!相反,只需:

class C { /* ... */ };

void func() {
    C var;
    C *ptr = &var;

    // do whatever with ptr
}

您现在有一个指向堆栈上分配的对象的指针.而且,当你的函数存在时它会被正确地销毁.


你的例子就是我的意思,它通过值将它声明为局部变量.

3> David Allan ..:

你可以这样做:

Whatever* aWhatever = new ( alloca(sizeof(Whatever)) ) Whatever;

您可以使用RAII类来进行我认为的破坏(编辑:另请参阅此其他答案以获取有关此方法的潜在问题的更多信息):

template 
class RAII
    {
    public:
        explicit RAII( TYPE* p ) : ptr(p) {}
        ~RAII() { ptr->~TYPE(); }
        TYPE& operator*() const { return *ptr; }
    private:
        TYPE* ptr;
    }

void example()
    {
    RAII ptr = new ( alloca(sizeof(Whatever)) ) Whatever;
    }

您可以使用宏来隐藏alloca.

关心DaveF

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有