C++中深拷贝与浅拷贝

C++中深拷贝与浅拷贝常见场景为类的 拷贝构造函数赋值运算符重载 中。
其主要的区别在于指针成员的拷贝上,如果指针成员变量指向的内容位于动态申请的堆内存上,此时浅拷贝只是拷贝了指针变量,会造成多个指针指向同一块内存,当这些对象被析构时,就会造成多次释放同一块内存的问题,即 double free
为避免 double free 的问题,一般需要禁用拷贝构造函数和赋值运算符重载,或者重写这两个函数,避免编译器自动生成对应的浅拷贝函数。

/**
 * 头文件 .h
 */
class Basic_2
{
public:
    Basic_2();

    // 重写拷贝构造函数
    Basic_2(const Basic_2& bs);

    // 赋值运算符重载
    Basic_2& operator=(const Basic_2& bs);

    ~Basic_2();

private:
    int* p;
    int num;
};


/**
 * 实现文件 .cpp
 */
Basic_2::Basic_2():
    p(new int(6)),                 // 动态分配的堆内存
    num(1)
{

}

Basic_2::Basic_2(const Basic_2& bs):
    p(new int(*bs.p)),             // 拷贝的时候重新申请堆内存
    num(bs.num)
{

}

Basic_2& Basic_2::operator=(const Basic_2& bs)
{
    p = new int(*bs.p);           // 重新申请堆内存
    num = bs.num;

    return *this;
}

Basic_2::~Basic_2()
{
    delete p;
    p = nullptr;
}

posted @   Jeffxue  阅读(49)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
历史上的今天:
2023-08-09 git merge 和 git rebase
2023-08-09 git pull 与 git fetch
点击右上角即可分享
微信分享提示