c++ 调用析构函数是否完全明确地销毁对象?

如果我明确地调用析构函数(myObject.〜Object()),那么这样可以确保对象将被适当的销毁(调用所有子析构函数)?

确定一些代码:

class Object
{
   virtual ~Object()
   {}
};

class Widget : public Object
{
   virtual ~Widget()
   {}
};

...
Object* aWidget = new Widget(); //allocate and construct
aWidget->~Object(); //destroy and DON'T deallocate

我知道我可以删除对象,但我不想.我想保持分配的内存方便作为一个重要的优化.

谢谢!

答案是…几乎总是.

如果您的对象具有非虚拟析构函数,然后将其分类为添加需要释放的子元素…则调用对象基类上的析构函数将不会释放子元素.这就是为什么你应该总是声明析构函数.

我们有一个有趣的例子,两个共享库引用了一个对象.我们更改了定义以添加需要释放的子对象.我们重新编译了包含对象定义的第一个共享库.

然而,第二个共享库没有被重新编译.这意味着它不知道新添加的虚拟对象定义. Delete从第二个共享库调用,简单地称为free,并没有调用虚拟析构函数链.结果是一个讨厌的内存泄漏.

翻译自:https://stackoverflow.com/questions/1036019/does-calling-a-destructor-explicitly-destroy-an-object-completely

转载注明原文:c++ 调用析构函数是否完全明确地销毁对象?