C++中深浅拷贝问题(构造函数)
构造函数主要分为:默认构造函数和有参构造函数;构造函数又分为:普通的构造函数和copy构造函数(需传入自身的对象)
利用自己定义的构造函数解决浅拷贝所带来的潜在的析构过程中的bug。
改程序中主要是利用重写copy构造函数,通过给对象在自由存储区(堆)重新分配自己的存储空间,来实现深copy,从而避免上述所提到的潜在bug。
#include <iostream> using namespace std; class Name { public: Name(const char *myp) { m_len = strlen(myp); m_p = (char *) malloc (m_len + 1); //给指针分配内容空间 strcpy(m_p, myp); } //Name obj2 = obj1; //手动解决拷贝构造函数,使用深copy //指针的真正用武之地就是在运行时分配未命名的内存来储存值;c语言中使用malloc来分配,c++使用new运算符 Name(const Name & obj1) { m_len = obj1.m_len; m_p = (char *)malloc(m_len + 1); //给指针分配内容空间 strcpy(m_p, obj1.m_p); } ~Name() { if(m_p != NULL) { free(m_p);//释放的不是指针,而是指针指向的内容空间,如果是浅拷贝的话,则释放第二次的时候,容易报错。 m_p = NULL; m_len = 0; } } protected: private: char *m_p; int m_len; }; void objdisplaymain() { Name obj1("abcdefg"); Name obj2 = obj1; //默认的copy构造函数 C++编译器给我们提供的 } //在程序调用结束时,会调用析构函数来回收内存,析构掉obj1和obj2两个对象。根据析构函数的操作,浅拷贝会出现bug int main() { objdisplaymain(); cout << "hello..." << endl; return 0; }