• 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);//调用深拷贝构造函数
    
        //执行程序可以看到执行了两次析构函数
        
    }

  • 相关阅读:
    [bzoj4239]巴士走读
    [bzoj1146]网络管理
    [luogu3292]幸运数字
    [51nod1597]有限背包计数问题
    [bzoj2654]tree
    [bzoj2668]交换棋子
    [bzoj3173]最长上升子序列
    [hdu6715]算术
    [bzoj3784]树上的路径
    [bzoj1221]软件开发
  • 原文地址:https://www.cnblogs.com/liming19680104/p/14968792.html
Copyright © 2020-2023  润新知