如何重载新运算符以在堆栈上分配?

use*_*369 0 c++ memory-management

如何为类类型重载new运算符,以便它在堆栈而不是堆上分配内存(基本上这样用户之后就不必调用delete).

这样的事情怎么样:

class A{
    private:
        A(int i):
           this->i(i);
        {}
        A a;
        int i;

    public:
        void* operator new(size_t sz){
            a(12);
        }
};
Run Code Online (Sandbox Code Playgroud)

以上解决方案是否有效?

Lig*_*ica 9

别!

使用自动存储......

new操作被设计成实现动态分配(你是"上堆"呼叫什么),虽然你可以提供你自己的分配器,因此你不能拧成服从自动存储时间的对象的范围规则(你是什么呼叫"在堆栈上").

相反,写:

MyType myobject;  // automatic storage duration
Run Code Online (Sandbox Code Playgroud)

......或智能指针......

或者,如果你不介意的动态存储时间,但只是想避免以后手动销毁,使用智能指针:

std::unique_ptr<MyType> myptr(new myobject());  // unique, dynamic storage duration
std::shared_ptr<MyType> myptr(new myobject());  // shared, dynamic storage duration
Run Code Online (Sandbox Code Playgroud)

这些都可以在C++ 11(std::)和Boost(boost::)中找到.

......还是安置new

另一种方法可能是放置新的,但这是一条黑暗而危险的旅行路径,我在这个阶段肯定不会推荐.或者,坦率地说,任何阶段......你通常仍然需要手动破坏.你获得的只是使用关键字new,这似乎毫无意义.

  • +1:我喜欢大胖子**不要!**! (3认同)