我如何为类类型重载 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
,这似乎毫无意义。