iam*_*ind 10 c++ destructor placement-new explicit-destructor-call
这里的"简单",我指的是一个非虚拟空析构函数或POD类型的类.
典型例子:
char buffer[SIZE];
T *p = new(buffer) T;
...
p->~T(); // <---- always ?
Run Code Online (Sandbox Code Playgroud)
如果我们不调用显式析构函数会发生什么p
?我不认为这是未定义的行为或内存泄漏.
重用有什么问题buffer
吗?
Căt*_*tiș 12
从技术上讲,假设析构函数不释放在构造期间获得的任何资源,则可能没有必要.
但是,考虑到非技术方面 - 代码的维护和发展 - 我会坚持最佳实践 - 构建的内容应该被破坏.需要考虑的场景 - 如果将来某些更改将确定要在析构函数中放入相关代码,该怎么办?你会记得你曾经破坏过那种类型的物体吗?
对于POD类型或具有普通析构函数的类:否.当释放或重用对象的存储时,对象的生命周期将结束.如果您不想,则不必显式调用析构函数.
那就是说,没有理由不这样做.对于具有普通析构函数的类型,析构函数调用将不生成代码.
如果具有"空"析构函数的类允许类具有成员或基类具有非平凡析构函数的可能性,那么如果程序依赖于调用这些析构函数,则可能会得到未定义的行为.
请注意,用户提供的析构函数是一个非平凡的析构函数,即使它是非虚拟的并且是空的.尽管如此,如果您的程序不依赖于析构函数的任何副作用,您仍然可以通过简单地释放或重用其存储来终止具有此类析构函数的对象的生命周期.(参见ISO/IEC 14882:2011的3.8 [basic.life]/4)
归档时间: |
|
查看次数: |
1745 次 |
最近记录: |