这个是数据结构
class Ctemp{ public: char *s; ~Ctemp() { if(NULL!=s) free(s); s=NULL; } };
错误复现
void testFunction() { Ctemp temp1; temp1.s = (char *)malloc(5); Ctemp temp2=temp1; }
错误原因: temp1 和 temp2的作用域为testFunction函数内.调用 testFunction()结束以后,会自动调用构造函数,由于temp1和temp2的成员属性s都指向同一个地址单元,所以会释放两次。
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创
- 通过使用另一个同类型的对象来初始化新创建的对象。
- 复制对象把它作为参数传递给函数。
- 复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数——c++拷贝构造函数
修改方法
class Ctemp{ public: char *s; Ctemp(const Ctemp& obj) { if(NULL!=obj.s){ s=(char*)malloc(strlen(obj.s)+1); } } ~Ctemp() { if(NULL!=s) free(s); s=NULL; } };