何时明确调用C ++析构函数?

时间:2010-01-21 01:48:55

标签: c++ destructor

您需要显式调用析构函数的实例是什么?

3 个答案:

答案 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);

这主要存在于分配器(由容器使用)中,分别位于constructdestroy函数中。

否则,不要。堆栈分配将自动完成,就像您delete指针时一样。 (使用智能指针!)

嗯,我想这又有一个原因:当你想要未定义的行为时。然后随意调用它多次......:)

答案 1 :(得分:4)

没有。您永远不需要显式调用析构函数(placement new除外)。

(无耻C++ FAQ Lite插件;>)

在扩展说明中,调用析构函数是编译器的保证 - 通过在目标分配中使用new,您可以打破这种保证 - 这绝对是一件危险的事情。如果需要特殊分配,通常最好编写自定义分配器和/或覆盖新/删除。

另请注意,明确调用析构函数可能会出现极端复杂情况,并且不应该在除上述情况之外的任何其他情况下完成。

答案 2 :(得分:0)

当对象离开作用域时,会自动为自动存储类型的对象调用析构函数,并且当对它们使用delete运算符时,将调用堆上对象的析构函数。