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

标签 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);
        }
};

上述解决方案行得通吗?

最佳答案

不要!

使用自动存储...

new 运算符旨在实现动态分配(您所谓的“在堆上”),尽管您可以提供自己的分配器,但您不能将其扭曲为遵守作用域自动存储持续时间对象的规则(你所谓的“在堆栈上”)。

相反,写:

MyType myobject;  // automatic storage duration

...或智能指针...

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

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

这两者都可以在 C++11 (std::) 和 Boost (boost::) 中找到。

... 还是放置 new

另一种方法可能是placement new,但这是一条黑暗而危险的旅行之路,我在现阶段肯定不会推荐。或者,坦率地说,任何阶段……您通常仍然需要进行手动销毁。您所获得的只是使用关键字 new,这似乎毫无意义。

关于c++ - 如何重载新运算符以在堆栈上分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13123609/

相关文章:

c++ - 使用 QComboBox C++ 进行过滤

c++ - 简化 Do While 循环检查空指针

c++ - 指向函数和 ODR 的指针

C++ ftp上传错误

objective-c - 使用 block 在 `self` 上保留循环

将段落转换为具有动态内存的句子

c - 通过复制返回一个结构,它封装了一个指针

c++ - 如何在 C++ 中对二进制数据使用 >> 和 << 运算符?

c - 为什么32bit的内存只需要1bit的map

c - 将链表实现与 malloc 函数分离