如何使新操作员超载以分配堆栈
How can I overload the new operator to allocate on the stack?
如何将新的操作员重载用于类型类型,以便它在堆栈上分配内存而不是堆(基本上是为了以后用户不必调用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
?
另一种方法可能是安置新的,但这是一条黑暗而危险的旅行途径,我当然不建议在此阶段。或者,坦率地说,任何阶段...通常您通常仍然需要进行手动破坏。您所获得的只是使用关键字new
,这似乎毫无意义。
我认为这里的好答案是:
不超载操作员新。
如果您仍然想穿过那条路,您可以查看这个问题。
如果没有,您始终可以使用智能指针或共享指针来避免用户必须删除分配的内存。
看来您不知道自己在问什么。根据定义,新操作员将内存分配在堆上。要在堆栈上创建一个对象,只需将其声明为局部变量即可。
看着你实际想做的事情,你说你认为这很棒的原因是:
基本上是为了使用户不必以后调用删除
使用智能指针实现该功能。我强烈建议您花时间学习这些。
为什么不只是自动变量(它是"堆栈",而不需要手动调用destructor:
int foo() {
A a;
int i;
...
// don't need to call delete
}
从字面上回答您的问题,有新的位置,它可以从用户中获取内存 - 因此您可以将此内存作为自动缓冲区:
alignas(int) char buffer[sizeof(int)];
int* p = new (buffer) int;
// ^^^^^^^^
对于非POD对象 - 您不需要调用删除 - 但是您必须手动调用destuructor:
class A { public: ~A(){} };
alignas(A) char buffer[sizeof(At)];
A* p = new (buffer) A;
// ^^^^^^^^
p->~A();
alignas
在C 11中是新的 - 在C 03中,您必须以某种方式处理适当的对齐方式。必须从new
返回正确的对齐内存 - 否则行为是未定义的。
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 巨大的内存分配:堆栈与堆
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 安全分配堆栈分配的阵列
- 附加到具有非动态分配堆栈的向量
- 是否随作用域分配和解除分配堆栈帧
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 全局阵列分配 -- 堆栈或堆
- 如何使新操作员超载以分配堆栈
- 具有类作用域的动态分配堆栈内存
- 如何在 Linux 下为可执行文件分配堆栈
- 内存分配堆栈
- 成员函数内存分配堆栈或堆
- 在 c++ 中重新分配堆栈上的对象
- 防止为类和派生类分配堆栈
- 如何防止msvc++为switch语句过度分配堆栈空间?