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);//调用深拷贝构造函数

    //执行程序可以看到执行了两次析构函数
    
}
复制代码

 

 

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(75)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2019-07-04 ESP8266-让灯闪烁
点击右上角即可分享
微信分享提示

目录导航