问题:我们都知道析构函数在类对象作用域结束时自动调用,但这个规则适合基本类型,但不适合delete函数
原因:如果对象是new运算符动态创建的,如果最后没有调用delete(),则析构函数不会被自动调用,如果调用delete()则析构函数会被调用。
例子:
代码:
#include<iostream>
using namespace std;
class Test {
public:
Test (char test){
ch = test;
cout << "调用了" << ch << "构造函数" << '\n';
}
~Test(){
cout << "调用了" << ch << "析构函数" << '\n';
}
private:
char ch;
};
int main()
{
char ch_A = 'A';
char ch_B = 'B';
Test A(ch_A);//这是正常声明一个对象
Test* B; //这是用new声明对象
B = new Test(ch_B);
//delete(B);
return 0;
}
可以看到上面的代码中,我们是注释掉delete(),我们运行看下结果
可以看到 Test A 的构造和析构都出现了,但是 B只有 调用了B构造函数
如果我们调用delete(),我们运行看下结果
int main()
{
char ch_A = 'A';
char ch_B = 'B';
Test A(ch_A);//这是正常声明一个对象
Test* B; //这是用new声明对象
B = new Test(ch_B);
delete(B);
return 0;
}
可以看到 Test A 的构造和析构都出现了,B的构造和析构也都出现了
结论:
如果对象是new运算符动态创建的,我们最后一定要加delete(),否则析构函数无法创建,而且也会造成内存泄漏!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)