自己写的析构函数为什么是程序在结束时崩了?

#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;
}

这哪里重载了。。。。还是浅拷贝。就是重载有问题才会导致两次析构同一块内存,系统崩溃。

补充===

出错原因是,应该定义和声明分开放。

定义和声明在一起的时候,没有执行等号的重载。