首页 > 编程语言 >C++中深拷贝与浅拷贝

C++中深拷贝与浅拷贝

时间:2024-08-09 11:08:01浏览次数:7  
标签:const int Basic C++ num 中深 bs 拷贝

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;
}

标签:const,int,Basic,C++,num,中深,bs,拷贝
From: https://www.cnblogs.com/Jeffxu/p/18350408

相关文章

  • C++——类和对象(全)
    1.类的定义1.1类定义格式classStack{};1)class为定义类的关键字Stack为类的名字,{};中为类的主体(分号不能省略)。2)类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中函数称为类的方法或成员函数;3)为了区分成员变量,一般在成员变量会加上特殊标识_或则m开头。4)C+......
  • 【自动驾驶】自定义消息格式的话题通信(C++版本)
    目录新建消息文件更改包xml文件中的依赖关系更改cmakelist文件中的配置执行时依赖改变cmakelist编译顺序发布者程序调用者程序程序测试新建消息文件在功能包目录下,新建msg文件夹,下面新建mymsg.msg文件,其内容为stringnamefloat64value发布者包含该消息,生成头文......
  • C++ 禁用类的拷贝构造函数和赋值运算符
    C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候doublefree,引起崩溃的问题。因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。......
  • nodejs语言,MySQL数据库;springboot的个性化资讯推荐系统66257(免费领源码)计算机毕业设计
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,个性化资讯推荐系统当然也不能排除在外。个性化资讯推荐系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot技术构建的一个管理系统。整......
  • c#语言,SQL server数据库;基于Web的社区人员管理系统的设计与实现36303(免费领源码)计算机
    目 录摘要1绪论1.1慨述1.2课题意义1.3B/S体系结构介绍1.4ASP.NET框架介绍2 社区人员管理系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程52.2.3数据删除流程52.3系统功能分析62.3.1功能性分析62.3.2非功能性......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 【C++】构造函数类别
    1、默认构造函数形式:没有入参调用方式:直接定义声明:Constructor();调用:Constructorc;2、初始化构造函数形式:有参数列表调用方式:传参即可声明:Constructor(inta,intb);调用:Constructorc(1,2);3、拷贝构造函数形式:参数为变量常引用调用方式:当使用现有对象初......
  • C++标准模板库(STL)|容器|vector| queue|
    对STL进行总结,STL是standardtemplatelibrary的简写,是C++中的一个标准模板库,用于实现常用的数据结构和算法,它是C++程序员经常使用的一个工具箱。STL的主要目的是提高开发效率和代码质量,使得程序员可以更加便捷地完成常见的操作。里面包括:算法(algorithm)、容器(container)、仿函......
  • C++ Rect And Point Search Algorithm
    测试 ////Createdbywwwon2024/8/8.//#include"include/cxstructs.h"#include"include/cxml/k-NN.h"//可扩展Rect内搜索子Rect或PointvoidtestRectSearch(){usingnamespacecxstructs;std::random_devicerd;std::mt19937gen(rd()......
  • Linux C++ 开发2 - 编写、编译、执行第一个程序
    上一篇《LinuxC++开发1-搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。1.第一个C++程序1.1.demo01.cpp这里写一个最简单的HelloWord程序#include<iostream>intmain(){std::cout<<"Hello,world!"<<std::endl;re......