c++之深拷贝和浅拷贝

c++之深拷贝和浅拷贝,第1张

概述浅拷贝:简单的赋值拷贝 *** 作。 深拷贝:在堆区重新申请空间,进行拷贝 *** 作。 #include<iostream> using namespace std; class Person { pu

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

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

#include<iostream>using namespace std;class Person {public:    int m_age;    int* m_height;    Person() {        cout << "Person默认构造函数" << endl;    }    Person(int age, height) {        m_age = age;        m_height = new (height);//浅拷贝        cout << Person(int age)构造函数const Person& p) {        m_age = p.m_age;        m_height = 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;} main() {    test();    system(pause");    return 0;}

输出:

 

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

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

总结

以上是内存溢出为你收集整理的c++之深拷贝和浅拷贝全部内容,希望文章能够帮你解决c++之深拷贝和浅拷贝所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1159002.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-01
下一篇2022-06-01

发表评论

登录后才能评论

评论列表(0条)

    保存