#include<iostream>
using namespace std;
class Persons
{
public:
int* p_age;
void operator = (Persons& p)
{
p_age = new int(*p.p_age);
}
Persons(){}
Persons(int num)
{
p_age = new int(num);
}
~Persons()
{
delete p_age;
p_age = NULL;
}
};
int main()
{
Persons p1(35);
cout << *p1.p_age << endl;
Persons p2 = p1;
cout << *p2.p_age << endl;
system("pause");
return 0;
}
改成
~Persons()
{
delete []p_age;
}
===我怎么感觉你写的也没啥问题呢。
debug可以发现,你的p1和p2都指向同一个内存地址,假设都是A,但是析构函数需要调用两次(看第二图),第一次没问题,你已经把A释放掉了,但是p2还是指向的A,所以第二次调用析构函数的时候,你删除p2怎么删除。。。A都没了。
Persons p2 = p1; 这句代码调用的不是operator =, 而是默认拷贝构造函数。你没有实现自己的拷贝构造函数,导致p2的构造其实是对p1的浅拷贝。即p1,p2 指向同一块内存,程序结束时,两个对象的析构函数都被调用导致double free.
就很奇怪,用系统的析构就没事,但自己一写就崩
我在运行你的代码的时候并没有发生程序崩溃的现象,能否把崩溃的详细情况描述一下。
另 推荐在类中调用对象成员的时候使用this指针,避免因重名发生错误,如下
#include<iostream>
using namespace std;
class Persons
{
public:
int* p_age;
void operator = (Persons& p)
{
this->p_age = new int(*p.p_age);
}
Persons(){}
Persons(int num)
{
this->p_age = new int(num);
}
~Persons()
{
delete this->p_age;
this->p_age = NULL;
}
};
int main()
{
Persons p1(35);
cout << *p1.p_age << endl;
Persons p2 = p1;
cout << *p2.p_age << endl;
system("pause");
return 0;
}
这哪里重载了。。。。还是浅拷贝。就是重载有问题才会导致两次析构同一块内存,系统崩溃。
补充===
出错原因是,应该定义和声明分开放。
定义和声明在一起的时候,没有执行等号的重载。