删除前手动调用析构函数

Ano*_*ity 3 c++ destructor undefined-behavior delete-operator

auto obj = new Object;
obj->~Object();
delete obj;
Run Code Online (Sandbox Code Playgroud)

我知道这很不寻常,但它是否定义了行为?它会引起任何令人惊讶的问题吗?

Whi*_*TiM 8

如果obj使用新对象替换指向的已销毁对象,只能执行此操作:

auto obj = new Object;
obj->~Object();

new (obj) Object();
delete obj;
Run Code Online (Sandbox Code Playgroud)

否则,您将调用未定义的行为.


你应该明白:

  • new调用operator new获取内存,然后调用提供的construtor来创建对象
  • delete调用对象的析构函数,然后调用operator delete"返回"内存.


编辑:正如Bo Persson指出的那样,如果你不能提供例外保证,这不是一个好主意

  • 如果*成功*替换对象.如果构造函数抛出,你仍然是吐司. (3认同)