如果一个类需要自己定义析构函数,往往需要自己定义拷贝构造和拷贝赋值,系统默认合成的拷贝构造和拷贝赋值知识简单的拷贝指针成员,意味着可能会造成多个指针指向同一个内存。
class A
{
private:
B* m_data;
}
A a1;
A a2(a1);
delete a2; // a1和a2同时被销毁
A a3(a1); // a3指向无效内存
解决方法一: 将拷贝构造函数和拷贝赋值函数设置为 private
class A
{
private:
A(const A& rhs);
const A& operator=(const A& rhs);
private:
B* m_data;
}
解决方法二: 将拷贝构造函数和拷贝赋值函数 = delete
class A
{
public:
A(const A& rhs)= delete;
const A& operator=(const A& rhs) = delete;
private:
B* m_data;
}