问题:C++中由于浅拷贝造成的程序中断错误的简例(编译通过,运行出现中断)

本程序通过VC++ 6.0编译与测试,程序设计为在指针中存入(0—4),未进行拷贝时,程序不会报错,正常输入,进行拷贝操作后,由于浅拷贝造成程序二次删除,进而报错,具体代码如下:

//一个分别对两个指针进行赋值的程序,程序正常运行
#include <iostream>
using namespace std;
class Test
{
public:
	Test()
	{
		pvar=new int[5];
		for(int i=0;i<5;i++)
		{
			pvar[i]=i;
		}
	}
	~Test()
	{
		delete []pvar;
		pvar=NULL;
	}

	void print()
	{
		for(int i=0;i<5;++i)
		{
			cout<<pvar[i]<<",";
		}
		cout<<endl;
	}
private:
	int *pvar;
};

int main()
{
	Test t1;
	t1.print();
	Test t2;
	t2.print();
	return 0;
}

运行结果:

//在主函数中进行拷贝操作,程序正常编译,运行出现中断
#include <iostream>
using namespace std;
class Test
{
public:
	Test()
	{
		pvar=new int[5];
		for(int i=0;i<5;i++)
		{
			pvar[i]=i;
		}
	}
	~Test()
	{
		delete []pvar;
		pvar=NULL;
	}

	void print()
	{
		for(int i=0;i<5;++i)
		{
			cout<<pvar[i]<<",";
		}
		cout<<endl;
	}
private:
	int *pvar;
};

int main()
{
	Test t1;
	t1.print();
	Test t2;
	t2.print();
	t1=t2;   //此处由于浅拷贝造成二次删除,从而引发中断错误
	return 0;
}

程序运行结果:

总结:

       对象如果含有指针成员变量,而指针变量又指向堆上空间,将只拷贝指针成员变量本身的值,造成两个对象的指针指向同一块堆上的内存空间,删除对象时(含复制)会造成二次删除,进而引发程序中断