在最近的一次采访中,我被要求回答这段代码是否安全,如果安全,我什么时候会使用这样的东西:
template<class T> T *CTricky<T>::Safe_Or_Not (T *object)
{
object->T::~T ();
::new (object) T;
return object;
}
我的回答是:这段代码是安全的,如果我需要通过调用它的析构函数来释放我的“对象”使用的资源,我会使用这种技术,但同时我不想释放我的“对象” "并希望它在内存中占有一席之地(通过在此处放置 new 来实现)。
老实说,我并不是在寻求帮助以在面试中正确回答这个问题。我只是想看看我对 placement new 和显式析构函数调用的理解是否正确。
最佳答案
简短的回答:虽然它不一定会导致问题,但真正安全地做到这一点是相当困难的。最大的问题是,如果通过 placement new throws 调用的构造函数,您已经销毁了该对象,但堆栈展开将再次尝试销毁它,从而导致未定义的行为。
虽然还有其他一些事情需要注意(例如,空指针),但这可能是最不明显且最难防止它引起问题的事情(基本上,你唯一的选择就是忍受未定义的行为并希望最好,或者在堆栈展开发生之前捕获异常并退出程序。
关于c++ - 正确使用 placement-new 和显式析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21719703/