zoukankan      html  css  js  c++  java
  • 类中含有指针,无拷贝构造导致的双倍释放,浅拷贝与深拷贝

    这个是数据结构

    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;
        }
    };
  • 相关阅读:
    Servlet文件上传下载
    通过jquery将多选框变单选框
    Java 浮点数精度控制
    JS实现点击table中任意元素选中
    SpringMVC-时间类型转换
    SpringMVC--提交表单
    路径 专题
    防盗链
    Request
    RequestResponse简介
  • 原文地址:https://www.cnblogs.com/pzqu/p/9457616.html
Copyright © 2011-2022 走看看