浅拷贝导致程序出错

#include <iostream>
class A {
public:
A(int i=0){
m_pi = new int(i);
}
~A(void) {
std::cout << "析构函数" << std::endl;
delete m_pi;
}
private:
int* m_pi;
};

int main()
{
A a(100);
A b(a);//执行拷贝构造--默认浅拷贝;导致执行析构函数时出错
//浅拷贝:把am_pi值给bm_pi值,由于m_pi是指针,所以ab指向同一个堆区数据,如下图所示
//同一个堆区不能被delete两次,在第二次delete时导致程序出错

}

C++浅拷贝与深拷贝_深拷贝

深拷贝

拷贝指针指向的数据,而不是拷贝指针 ,如下图
C++浅拷贝与深拷贝_数据_02

#include <iostream>
class A {
public:
A(int i=0){
m_pi = new int(i);
}
A(const A& that) { //自定义深拷贝构造函数
std::cout << "深拷贝构造函数" << std::endl;
m_pi = new int; //重新new空间
*m_pi = *that.m_pi; //往新空间拷贝数据
}
~A(void) {
std::cout << "析构函数" << std::endl;
delete m_pi;
}
private:
int* m_pi;
};

int main()
{
A a(100);
A b(a);//调用深拷贝构造函数

//执行程序可以看到执行了两次析构函数

}

C++浅拷贝与深拷贝_析构函数_03