class A
{
public:
A(char * p1 = NULL)
{
if (p1 == NULL)
{
p = new char[1];
p[0] = '\0';
}
else
{
p = new char[strlen(p1) + 1];
strcpy(p, p1);
}
}
~A()
{
delete[]p;
cout << "destruction" << endl;
}
private:
char * p;
};
int main()
{
A a("hello");
A b(a);
}
程序运行时出错
这是因为默认的拷贝构造(默认的赋值函数也一样)只是复制了指针(浅拷贝),指向了同一片内存,这样在a,b生命周期结束的时候,会delete这个内存两次,导致程序运行出错,增加以下的代码即可
A(const A& tmp)(深拷贝)
{
p = new char[strlen(tmp.p) + 1];
strcpy(p, tmp.p);
}
总结:浅拷贝只是复制了指针,并没有新分配内存,而深拷贝新分配了内存,并将数据复制了过来