在您的源代码中没有内存泄漏,因为您没有任何动态创建的成员变量。
考虑案例 1 下面的修改示例:
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
在这种情况下,输出将是,
Base Destructor called
在这种情况下存在内存泄漏,因为 'b' 是使用 'new' 动态创建的,应该使用 'delete' 关键字将其删除。由于没有调用 derv 析构函数,因此没有删除它,因此存在内存泄漏。
考虑以下情况 2:
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
virtual ~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
在情况 2 输出将是,
Derv Destructor called
Base Destructor called
在这种情况下,没有内存泄漏。因为调用了 derv 析构函数并且 b 被删除了。
析构函数可以在基类中定义为Virtual,以确保在删除指向派生类对象的基类指针时调用派生类析构函数。
我们可以说“当派生类动态创建成员时,析构函数必须是虚拟的”。