类中含有指针,无拷贝构造导致的双倍释放,浅拷贝与深拷贝

这个是数据结构

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;
    }
};
posted @   机智的程序员小熊  阅读(314)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示