实际上我正在考虑简单的可破坏的对象,不仅仅是关于POD(我不确定POD可以有基类).
当我从cppreference中读到is_trivially_destructible的这个解释时,我注意到这一点:
由简单可破坏的对象占用的存储可以在不调用析构函数的情况下重用.
所以,这样做是安全的:
struct A {
int a;
};
struct B : A {
int b;
};
int main() {
A* a = new B;
delete a;
}
Run Code Online (Sandbox Code Playgroud)
B::~B()将不会被调用 - 和AFAIK(如果我错了请更正)整个内存将被释放.而且B::~B()肯定是微不足道的.
我知道这段代码闻起来很糟糕,但我的问题只是关于这段代码的安全性......
要关闭选民,请帮助我改进问题,以便重新开启:我如何改进这个问题以便重新开放?
Herb Sutter 写道:
基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.
根据该指南,如果您有一个具有公共非虚拟析构函数的类,则该类不应该用作基类.为什么不标记它final来强制执行?
但Sutter也写了以下内容,暗示final不需要使用:
重新使用"决赛是罕见的" - 嗯,他们有点.我不知道很多,在标准化过程中,Bjarne反复询问它解决的问题和应该使用的模式的例子,我不记得任何突出的主要问题.
另一个相关的引用,暗示现在final应该使用它,来自Scott Meyer的Effective C++,第7项:
如果您曾试图从标准容器或任何其他具有非虚拟析构函数的类继承,请抵制诱惑!(不幸的是,C++没有提供类似于Java的最终类或C#的密封类的派生防止机制.)
另一个数据点是标准库没有标记为"final"的类型,但其原因似乎是避免破坏代码.
这里有一个类似的问题,但不完全是重复,因为它错过了"受保护的非虚拟"选项:默认为使类为"final"或给它们一个虚拟析构函数?