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

问题: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;
}

程序运行结果:

总结:

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

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

qq_15029743

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者