先看看代码
class Test
{
public:
int *pInt;
Test()
{
pInt=new int[10];
for(int i=0;i<10;i++)
{
pInt[i]=i*i;
}
}
~Test()
{
delete []pInt;
}
};
void f(Test &t)
{
for(int i=0;i<10;i++)
{
cout<<t.pInt[i]<<endl;
}
}
int main(void)
{
Test t;
f(t);
for(int i=0;i<10;i++)
{
cout<<t.pInt[i]<<endl;
}
}
上边的这个代码会出现什么问题?
当我们运行的时候,提示
double free or corruption (fasttop): 0x0000000001f43c20 ***
释放了两次new的内存,那么问题出在哪里呢?
关键问题在于f(t)的调用。
Test t;
f(t);
这两行的调用过程是这样的:
Test temp;
temp.Test::Test(t);//这里执行的是浅拷贝,将t中的pInt指针拷贝给了temp,temp作为f函数的参数,在
f(temp); //f函数的生命周期结束后,temp对象会调用其析构函数,释放掉本来t对象申请拷贝给temp对象的内存,所以会导致内存被释放两次
如果没有重载=运算符或者拷贝构造函数执行深拷贝,可以以引用的方式给f传参,从而避免这种情况。
另外,安利一本好书:《深度探索c++对象模型》,这种问题都是在这个书上发现的。