我不太确定我是否理解虚拟析构函数和在堆上分配空间的概念。让我们看下面的例子:
class Base
{
public:
int a;
};
class Derived : public Base
{
public:
int b;
};
我想如果我做这样的事情
Base *o = new Derived;
在堆上分配了 8 个字节(或系统需要的任何两个整数),看起来像这样: ... |一个 |乙 | ...
现在如果我这样做:
delete o;
'delete' 如何知道实际上是哪种类型的 o 以便从堆中删除所有内容?我想它必须假设它是 Base 类型,因此只从堆中删除 a (因为它不能确定 b 是否属于对象 o): ... |乙 | ...
b 将保留在堆上并且无法访问。
执行以下操作:
Base *o = new Derived;
delete o;
真正引起内存泄漏,我需要一个虚拟析构函数吗?或者 delete 是否知道 o 实际上是 Derived 类的,而不是 Base 类的?如果是这样,它是如何工作的?
谢谢大家。 :)
最佳答案
您对实现做出了很多假设,这可能
或者可能不成立。在 delete
表达式中,动态类型必须是
与静态类型相同,除非静态类型具有虚拟
析构函数。否则,它是未定义的行为。时期。那是
真的所有你必须知道的——我用过的实现
否则它会崩溃,至少在某些情况下是这样;我用过
这样做会破坏自由空间的实现,所以
代码稍后会在完全不相关的部分崩溃
的代码。 (郑重声明,VC++ 和 g++ 都属于第二种情况,在
至少在使用发布代码的常用选项编译时。)
关于c++ - 虚拟析构函数和内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047082/