C++浅拷贝与深拷贝
浅拷贝导致程序出错
#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);//执行拷贝构造--默认浅拷贝;导致执行析构函数时出错 //浅拷贝:把a的m_pi值给b的m_pi值,由于m_pi是指针,所以a和b指向同一个堆区数据,如下图所示 //同一个堆区不能被delete两次,在第二次delete时导致程序出错 }
深拷贝
拷贝指针指向的数据,而不是拷贝指针 ,如下图
#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);//调用深拷贝构造函数 //执行程序可以看到执行了两次析构函数 }