问题: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;
}
程序运行结果:
总结:
对象如果含有指针成员变量,而指针变量又指向堆上空间,将只拷贝指针成员变量本身的值,造成两个对象的指针指向同一块堆上的内存空间,删除对象时(含复制)会造成二次删除,进而引发程序中断