您需要显式调用析构函数的实例是什么?
答案 0 :(得分:9)
当你使用placement-new是一个常见的原因(唯一的原因?):
struct foo {};
void* memoryLocation = ::operator new(sizeof(foo));
foo* f = new (memoryLocation) foo(); // note: not safe, doesn't handle exceptions
// ...
f->~foo();
::operator delete(memoryLocation);
这主要存在于分配器(由容器使用)中,分别位于construct
和destroy
函数中。
否则,不要。堆栈分配将自动完成,就像您delete
指针时一样。 (使用智能指针!)
嗯,我想这又有一个原因:当你想要未定义的行为时。然后随意调用它多次......:)
答案 1 :(得分:4)
没有。您永远不需要显式调用析构函数(placement new除外)。
(无耻C++ FAQ Lite插件;>)
在扩展说明中,调用析构函数是编译器的保证 - 通过在目标分配中使用new,您可以打破这种保证 - 这绝对是一件危险的事情。如果需要特殊分配,通常最好编写自定义分配器和/或覆盖新/删除。
另请注意,明确调用析构函数可能会出现极端复杂情况,并且不应该在除上述情况之外的任何其他情况下完成。
答案 2 :(得分:0)
当对象离开作用域时,会自动为自动存储类型的对象调用析构函数,并且当对它们使用delete运算符时,将调用堆上对象的析构函数。