c++ - 正确使用 placement-new 和显式析构函数调用

标签 c++ placement-new explicit-destructor-call

在最近的一次采访中,我被要求回答这段代码是否安全,如果安全,我什么时候会使用这样的东西:

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/

相关文章:

c++ - 是否有检索整数输入的函数?

c++ - 浮点除法的软件实现,舍入问题

c++ - std::shared_ptr 预分配内存

c++ - 为什么不能正确解析显式析构函数调用中的限定类型名称?

c++ - 在 'this' 指针上使用 placement new 是否安全

c++ - 显式调用 C++ 对象的析构函数

c++ - 告诉 `endl` 不要刷新

c++ - 在低完整性进程下如何查询进程名称?

C++自定义placement new和placement delete调用

c++ - 为什么不能显式调用构造函数而析构函数可以?