zoukankan      html  css  js  c++  java
  • c++之深拷贝和浅拷贝

    浅拷贝:简单的赋值拷贝操作。

    深拷贝:在堆区重新申请空间,进行拷贝操作。

    #include<iostream>
    using namespace std;
    
    class Person {
    public:
        int m_age;
        int* m_height;
        Person() {
            cout << "Person默认构造函数" << endl;
        }
        Person(int age,int height) {
            m_age = age;
            m_height = new int(height);//浅拷贝
            cout << "Person(int age)构造函数" << endl;
        }
        Person(const Person& p) {
            m_age = p.m_age;
            m_height = new int(*p.m_height);//这就是深拷贝操作
            cout << "拷贝构造函数" << endl;
        }
        ~Person() {
            //将堆区的数据进行释放
            //浅拷贝带来的问题就是重复释放,可以利用深拷贝来解决
            if (m_height != NULL) {
                delete m_height;
                m_height = NULL;
            }
            cout << "Person析构函数" << endl;
        }
    
    };
    void test() {
        Person p1(18,178);
        cout << "p1的年龄为:" << p1.m_age << "身高为:"<<*p1.m_height<<endl;
        Person p2(p1);
        cout << "p2的年龄为:" << p2.m_age << "身高为:" << *p2.m_height << endl;
    }
    int main() {
        test();
        system("pause");
        return 0;
    }

    输出:

    为什么浅拷贝会带来重复释放问题呢?

    在堆区开辟内存存储数据之后,如果不自己定义拷贝构造函数,那么系统会调用默认的拷贝构造函数,这种情况下就是浅拷贝,此时,p2和p1的m_height都指向同一块地址。当p2被释放之后,即指向的地址释放了,此时再去释放p1,p1就找不到其指向的内存,但是又要进行释放,所以就重复释放,运行时会报错。

  • 相关阅读:
    并行和并发
    怎样用第三方开源免费软件portecle从https站点上导出SSL的CA证书?
    我持续推动Rust语言支持Windows XP系统
    Android——4.2.2 文件系统文件夹分析
    hadoop(八)
    自己定义html中a标签的title提示tooltip
    多个返回 顶部的代码
    同学们,OpenCV出3.0了,速去围观!
    hdu1002
    好记性不如烂笔头(一)
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12095198.html
Copyright © 2011-2022 走看看