当一个类中有动态分配内存时,应当自己定义拷贝构造函数和赋值函数
class A
{
int *p;
public:
A()
{
p = new int[10];
}
~A()
{
delete p;
}
};
void f(A x)
{
cout << "Yes" << endl;
}
int main()
{
A a;
f(a);
}
运行时出错,因为f(a)时调用了拷贝构造函数(简单的复制,p=x.p),当f(a)结束时会调用x的析构函数,delete p,而a到了生命周期后也会调用析构函数,delete 已经被delete的p;
修改为:
class A
{
int *p;
public:
A()
{
p = new int[10];
}
~A()
{
delete p;
}
A(A &x)
{
p = new int[10];
*p = *(x.p);
}
};
void f(A a)
{
cout << "Yes" << endl;
}
int main()
{
A a;
f(a);
}
默认赋值函数同理