析构函数 C++ 使泄漏内存

destructor c++ make leak memory

本文关键字:内存 泄漏 C++ 析构函数      更新时间:2023-10-16

我很难弄清楚这个析构函数是如何调用的

所以我有带有虚拟析构函数和内联虚拟克隆函数的 A 类

class A{
public:
A(){ }
virtual ~A(){
qDebug() << "Class A destructor";
}
inline virtual A *clone(){
return NULL;
}
};

然后我有子类 B 也有析构函数和克隆函数返回指向类 A 的指针

class B : public A{
public:
B() { }
~B(){
qDebug() << "Class B destructor";
}
A *clone(){
B *temp = new B();
return static_cast<A *>(temp);
}
};

我有主要功能和测试功能,我开始做一些关于指针的疯狂事情

A *test(A *input){
return input->clone();
}
int main(){
B temp2;
A *temp = test(&temp2);
delete temp;
return 0;
}

最后,如果我有输出是

Class B destructor
Class A destructor
Class B destructor
Class A destructor

如果我在析构函数类 A 之前没有使用虚拟,我有输出是

Class A destructor
Class B destructor
Class A destructor

所以谁能解释为什么虚拟会让这么多不同

何时使用虚拟析构函数?

简而言之:没有虚拟就没有 vTable,并且在运行时调用基类之一时无法找到派生析构函数。