C++之浅拷贝和深拷贝

浅拷贝:简单的复制拷贝操作

P1的生命周期结束后,判断m_PtrAge是否为空,很明显m_PtrAge的值是0x0100,不为空,释放m_PtrAge指向的内存;
P2的生命周期结束后,同样判断m_PtrAge是否为空,很明显m_PtrAge的值也是0x0100,也不为空,再次释放m_PtrAge指向的内存空间;
两次释放都指向同一块内存空间,造成堆区的数据重复释放,固有以上的crash信息,这就是浅拷贝带来的风险。
解决办法:
利用深拷贝解决浅拷贝带来的风险,即让P2对象中的m_PtrAge指向另一个内存单元,这样2个对象调用析构函数后,各自释放自己的内存单元
深拷贝:在堆区重新申请内存空间,进行拷贝操作

#include<iostream>
#include<string.h>
#include<memory>
#include<stdio.h>
using namespace std;

//深浅拷贝操作
class Person
{
    public:
        
        Person()
        {
            printf("Person的构造函数调用\n");
        }

        Person(int a, int h)
        {
            m_age = a;
            m_height = new int(h);
            printf("Person的有参构造函数调用\n");
        }

        ~Person()
        {
            //将堆区开辟的空间释放掉
            if (m_Height != NULL)
            {
                delete m_Height;
                m_Height = NULL; //防止野指针出现
            }
            printf("Person的析构造函数调用\n");
        }

        Person(const Person &p)
        {
            printf("Person拷贝造函数调用\n");
            m_age = p.m_age; 
            // m_height = p.m_height; //编译器默认实现就是这行代码(浅拷贝)
            m_height = new int(*p.m_height); //深拷贝操作
        }
    int m_age;
    int *m_height;
}
int main()
{
  Person p1(18, 160);
  printf("Person p1.age: %d, *p1.height: %d\n", p1.age, *p1.height);
  Person p2(p1);
  printf("Person p2.age: %d, *p2.height: %d\n", p2.age, *p2.height);
  return 0;
}

 

posted @ 2023-06-05 11:32  韓さん  阅读(8)  评论(0编辑  收藏  举报