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

  • 相关阅读:
    数据分析1-2
    数据分析1-1
    数据分析案例:
    数据分析1:安装tushare安装包
    小爬爬7:回顾&&crawlSpider
    小爬爬6: 网易新闻scrapy+selenium的爬取
    小爬爬6:中间件
    小爬爬6:2请求传参
    前端 -----jQuery的选择器
    前端 ----jQuery的介绍
  • 原文地址:https://www.cnblogs.com/liming19680104/p/14968792.html
Copyright © 2011-2022 走看看