类中含有指针,无拷贝构造导致的双倍释放,浅拷贝与深拷贝
  TEZNKK3IfmPf 2024年03月30日 30 0

这个是数据结构

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;
}
};
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年03月30日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年03月22日   42   0   0 jar包class
TEZNKK3IfmPf