在新的放置缓冲区上调用析构函数
Calling destructors on new placement buffer?
所以我有这个类
class Obj{ //simple class with constructor + destructor
public:
Obj(){cout<<"Obj1 has been created"<<endl;}
~Obj(){cout<<"Obj1 has been destroyed"<<endl;}
};
Obj * buffer[10]; //buffer
int main(int argc, char *argv[])
{
Obj * c = new(&buffer[0]) Obj;
delete &buffer[0];
system("PAUSE");
return EXIT_SUCCESS;
}
这种使用位置"new"的方法是有效的吗?因为当我试图删除地址时,没有调用析构函数
但是如果我使用这行代码,析构函数将被调用
Obj * c = new(&buffer[0]) Obj;
delete c;
谁能告诉我发生了什么事?我真的必须删除指针才能调用析构函数吗? 在您的示例中使用位置new以及试图销毁它都是无效的:
- 数组
buffer
包含指向Obj
的指针。不能保证指针为对象提供足够的空间,也不能保证指针正确对齐以容纳对象的对象。 - 要销毁用placement new构造的对象,你需要一个显式的析构函数调用,看起来像
ptr->~Obj()
。
正确的位置设置应该是这样的:
Obj* objects[10];
char* buffers[10];
// ...
buffers[1] = new char[sizeof(Obj)];
objects[1] = new(buffers[1]) Obj();
// ...
objects[1]->~Obj();
delete[] buffers[1];
(显然,在实际代码中,您将通过合适的RAII类来保护不同的缓冲区和对象,以避免资源泄漏)。
使用new位置时,必须直接调用析构函数。
buffer[0].~Obj();
// or
c->~Obj();
你必须NOT在对象上调用delete,因为这会尝试释放内存。由于内存没有分配new,这是未定义的行为。
// delete &buffer[0]; Don't do this.
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常