消失的析构函数
众所周知多态是C++的一个核心特性,通过父类指针可以指向子类对象,然后通过父类指针进行操作,而下面这个例子会出现一个我们常常忽略的一个问题
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
class Father {
public:
Father(const char* addr = "中国") {
cout << "执行Father的构造函数" << endl;
int len = strlen(addr)+1;//+1是为了‘\0'
this->addr = new char[len];
strcpy_s(this->addr, len,addr);
}
~Father() {
cout << "执行Father的析构函数" << endl;
if (addr) {
delete addr;
addr = NULL;
}
}
void description() {
cout << addr << endl;
}
private:
char* addr;
};
class Son :public Father {
public:
Son(const char*game = "愤怒的小鸟", const char*addr = "中国"):Father(addr) {
cout << "执行Son的构造函数" << endl;
int len = strlen(game) + 1;
this->game = new char[len];
strcpy_s(this->game, len, game);
}
~Son() {
cout << "执行Son的析构函数"<< endl;
if (game) {
delete game;
game = NULL;
}
}
private:
char*game;
};
int main() {
Father*f1 = new Son();
delete f1;
return 0;
}
运行结果为
如果这样的代码存在一个大循环中的话可能就会造成内存泄漏,那要怎么解决这个问题呢?👇
只需要在父类的析构函数前加virtual即可
virtual ~Father() {
cout << "执行Father的析构函数" << endl;
if (addr) {
delete addr;
addr = NULL;
}
}
总结:
以后不管会不会遇到这种情况都尽量养成把基类的析构函数前加个virtual