c/c++ 浅拷贝
程序员文章站
2022-05-23 19:42:38
c/c++ 浅拷贝 编译器合成的 拷贝构造函数 和 =重载函数 ,只是做如下处理: 如果成员变量a是指针,执行完 拷贝构造函数 或者 =重载函数 后,对象1和对象2的成员变量就指向了一个地址了,所以当改变对象1的a的值,对象2的a的值也变化了, 而且,如果在析构函数里写了free(a)的话,就相当于 ......
c/c++ 浅拷贝
编译器合成的拷贝构造函数和=重载函数,只是做如下处理:
对象1.成员变量a = 对象2.成员变量a
如果成员变量a是指针,执行完拷贝构造函数或者*=重载函数**后,对象1和对象2的成员变量就指向了一个地址了,所以当改变对象1的a的值,对象2的a的值也变化了,
而且,如果在析构函数里写了free(a)的话,就相当于对同一个地址free了2次,系统就会在执行时崩溃。
下面的代码断点执行到return 0处,观察s, s1, s2的data成员变量的地址后,发现都指向同一个地址
#include <iostream> #include <string.h> using namespace std; class string{ public: string(const char* str = ""){ if(null == str){ data = (char*)malloc(sizeof(char)); *data = '\0'; } else{ data = (char*)malloc(sizeof(char) * (strlen(str) + 1)); strcpy(data, str); } } ~string(){ free(data); data = null; } char* getdata(){ return data; } private: char *data; }; int main(){ char* a = "abc"; string s(a); string s1(s); string s2; s2 = s; return 0; }