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就找不到其指向的内存,但是又要进行释放,所以就重复释放,运行时会报错。

  • 相关阅读:
    (转) Android的Window类
    android 打开文件
    Android线程优先级
    Hierarchy viewer problems
    android:windowSoftInputMode
    (转) Android 安全机制
    Mobl试用之helloword
    写给自己对软件测试经历的总结
    Mobl试用二
    黑马程序员面向对象基础:属性和方法
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12095198.html
Copyright © 2011-2022 走看看