我该如何重载新操作符才能在堆栈上分配?
我如何重载一个类类型的新运算符,以便它将堆栈中的内存分配给堆而不是堆(基本上这样用户不必在事后调用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::
std::
中找到。
...或放置new
?
另一种方法可能是放置新的,但这是一个黑暗和危险的旅行途径,我当然不会在现阶段推荐。 或者,坦率地说,任何阶段......你通常仍然需要手动销毁。 你得到的只是使用关键字new
,这似乎毫无意义。
我认为这里的好答案是:
不要让操作员重载过多。
如果你仍然想通过这条路,你可以看看这个问题。
如果没有,你总是可以使用智能指针或共享指针来避免用户不得不删除分配的内存。
为什么不只是自动变量(这是“堆栈”,并不需要手动调用析构函数:
int foo() {
A a;
int i;
...
// don't need to call delete
}
为了从字面上回答你的问题,有新的位置,它从用户获取内存 - 所以你可以将这个内存作为自动缓冲区:
alignas(int) char buffer[sizeof(int)];
int* p = new (buffer) int;
// ^^^^^^^^
对于非POD对象 - 您不需要调用delete - 但必须手动调用析构函数:
class A { public: ~A(){} };
alignas(A) char buffer[sizeof(At)];
A* p = new (buffer) A;
// ^^^^^^^^
p->~A();
alignas
在C ++ 11中是新的 - 在C ++ 03中,你必须以不同方式处理正确的对齐。 正确对齐的内存必须new
返回 - 否则行为是不确定的。
上一篇: How can I overload the new operator to allocate on the stack?