假设我有一个类 A 和一个继承自 A 的类 B。 然后我做类似的事情:
A* a = new B();
delete a;
为什么只有在B内部有动态内存分配时才会发生内存泄漏? 当 B 中存在动态内存分配但失败时,C++ 如何知道删除“B 部分”?
[更新:]
以下代码如何不会导致内存泄漏:[我怀疑它是未定义的行为,但我真的不明白任何事:(]
#include <iostream>
using std::cout;
using std::endl;
class A {
public:
virtual void f() {
cout << "1" << endl;
}
~A() {
cout<< "A A'tor" << endl;
}
};
class B : public A {
private:
public:
B(){}
~B(){
cout<< "B D'tor" << endl;
}
void f() {
cout << "2" << endl;
}
};
int main() {
A* a = new B();
//a->f();
delete a;
return 0;
}
最佳答案
当编译器看到语句“delete a;”时
如果类 A 中没有虚析构函数,它只知道“a”的静态类型是指向 A 的指针。结果调用了错误的析构函数,导致内存泄漏
如果A类有虚析构函数 然后编译器知道“a”的动态类型是指向 B 的指针,并且会有一个 vtable,它将在运行时从那里获取 B 的析构函数地址
关于c++ - 删除多态对象和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26204843/