zoukankan      html  css  js  c++  java
  • C++浅拷贝与深拷贝

    浅拷贝导致程序出错 

    #include <iostream>
    class A {
    public:
        A(int i=0){
            m_pi = new int(i);
        }
        ~A(void) {
            std::cout << "析构函数" << std::endl;
            delete m_pi;
        }
    private:
        int* m_pi;
    };
    
    int main()
    {
        A a(100);
        A b(a);//执行拷贝构造--默认浅拷贝;导致执行析构函数时出错
        //浅拷贝:把a的m_pi值给b的m_pi值,由于m_pi是指针,所以a和b指向同一个堆区数据,如下图所示
        //同一个堆区不能被delete两次,在第二次delete时导致程序出错
        
    }

    深拷贝

    拷贝指针指向的数据,而不是拷贝指针 ,如下图

    #include <iostream>
    class A {
    public:
        A(int i=0){
            m_pi = new int(i);
        }
        A(const A& that) {  //自定义深拷贝构造函数
            std::cout << "深拷贝构造函数" << std::endl;
            m_pi = new int;  //重新new空间
            *m_pi = *that.m_pi;    //往新空间拷贝数据
        }
        ~A(void) {
            std::cout << "析构函数" << std::endl;
            delete m_pi;
        }
    private:
        int* m_pi;
    };
    
    int main()
    {
        A a(100);
        A b(a);//调用深拷贝构造函数
    
        //执行程序可以看到执行了两次析构函数
        
    }

  • 相关阅读:
    Oracle FGA审计记录的清理步骤
    UVa11488-Hyper Prefix Sets(trie树)
    配置Log4j(非常具体)
    poj1190生日蛋糕
    zju1610Count the Colors
    【例9.3】求最长不下降序列
    P1364 医院设置
    P1629 邮递员送信
    P1476 休息中的小呆
    P1330 封锁阳光大学
  • 原文地址:https://www.cnblogs.com/liming19680104/p/14968792.html
Copyright © 2011-2022 走看看