我想为大量对象分配内存。然后一一构造它们。因此,我执行以下操作:
BaseClass* buf = static_cast<BaseClass*> (::operator new (sizeof(BaseClass[5])));
for (int var = 0; var < 5; ++var) {
new (&buf[var]) BaseClass(var);
}
一切似乎都还好。但是当我添加删除时:
BaseClass* buf = static_cast<BaseClass*> (::operator new (sizeof(BaseClass[5])));
for (int var = 0; var < 5; ++var) {
new (&buf[var]) BaseClass(var);
// ... do something
delete &buf[var];
}
我收到“分段错误”错误。在第二次迭代(在构造函数上)。同时
delete [] buf;
工作正常。
所以问题是-为什么这样?
首先,如果您使用展示位置,new
则需要显式调用析构函数
buf[var].~BaseClass();
然后,您可以删除已分配给new的内容,尽管&buf[0]
它是new布置返回的地址,但仍可以&buf[1]
通过内存管理器直接分配,因此可以正常工作::operator new
。您不能一一释放它们。
所以你应该做类似的事情
::operator delete(buf);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句