C++ 深拷贝浅拷贝

C++默认生成的拷贝构造函数,他的行为就是浅拷贝,他只会复制一个一模一样的的指针,并不会操作指针指向的东西。

要想实现我们的逻辑需求,就要自定义拷贝构造函数,实现深拷贝。


我们来具体说明一下上面的话

首先我们创建一个简单的类

#include <iostream>
using namespace std;
class Person{
public:
Person(int age1):age(age1),m_ptr(nullptr)
{
if(age1>0)
m_ptr=(int*)malloc( age1 );
}
~Person()
{
free(m_ptr);
m_ptr=nullptr;
}
private:
int * m_ptr;
int age;
}; int main()
{
Person p1(10);
Person p2 = p1;
return 0;
}

这个时候就会发现编译没有问题,但是一旦运行就会报错。

这个是因为系统的默认拷贝构造是浅拷贝,把p1成员指针的内容复制给p2成员指针,导致这两个指针都指向的同一个内存地址

然后p1先调用析构函数,内存释放,接下来p2也会调用析构函数,但是由于p1已经释放了内存地址,该地址为空又调用free函数就会引发异常

这个时候我们需要自己实现拷贝构造函数,写一个深拷贝:

//修改后的代码
#include <iostream>
using namespace std; class Person{
public: Person(int age1):age(age1),m_ptr(nullptr)
{
if(age1>0)
m_ptr=(int*)malloc( age1 );
} Person(const Person& p):age(p.age),m_ptr(nullptr)
{
if(p.age>0)
m_ptr=(int*)malloc( p.age );
}
Person& operator=(const Person& p)
{
if(this == &p) //避免自我赋值
{return *this;}
free(m_ptr);
age=p.age;
m_ptr = (int*)malloc(p.age);
return *this;
}
~Person()
{
free(m_ptr);
m_ptr=nullptr;
}
private:
int * m_ptr;
int age;
}; int main()
{
Person p1(10);
Person p2 = p1;
return 0;
}

这个时候运行就不会产生异常,这就是深拷贝和浅拷贝

C++ 深拷贝浅拷贝的更多相关文章

  1. c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参

    c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...

  2. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  3. JavaScript之深拷贝&浅拷贝

    深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...

  4. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

  5. Java基础 深拷贝浅拷贝

    Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...

  6. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  7. JS Object Deep Copy & 深拷贝 & 浅拷贝

    JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...

  8. Map拷贝 关于对象深拷贝 浅拷贝的问题

    问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后      先看例子:     ...

  9. clone 深拷贝 浅拷贝

    1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性 2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set ...

  10. Python深复制浅复制or深拷贝浅拷贝

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...

随机推荐

  1. 记一次 .NET某工控自动化系统 崩溃分析

    一:背景 1. 讲故事 前些天微信上有位朋友找到我,说他的程序偶发崩溃,分析了个把星期也没找到问题,耗费了不少人力物力,让我能不能帮他看一下,给我申请了经费,哈哈,遇到这样的朋友就是爽快,刚好周二晚上 ...

  2. 你知道css3渐变吗线性渐变和径向渐变

    线性渐变 #app { width: 200px; height: 200px; background: linear-gradient(to bottom, red, green); /*从顶部到底 ...

  3. vue mixin混入 全局混入 局部混入

    <div id="app"> --{{nameName}} </div> // 全局混入 不需要注册 var m1 = Vue.mixin({ data() ...

  4. 手撕Vuex-添加全局$store

    经过上一篇的介绍,了解到了 Vuex 的实现本质就是一个插件,所以要做的事情就是实现这个插件的代码编写即可. 本篇文章主要是实现一个全局的 $store,这个 $store 是挂载在 Vue 的原型上 ...

  5. SqlSugar联表查询

    Join用法 语法糖1.2和3 在Where OrderBy GroupBy Select用法都一样的,他们区别就在JOIN的方式不一样,其它都一样 语法糖1 优点:好理解,5个表以内的联表非常爽,支 ...

  6. 开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界

    "开启中文智能之旅:探秘超乎想象的 Llama2-Chinese 大模型世界" 1.国内Llama2最新下载地址 本仓库中的代码示例主要是基于Hugging Face版本参数进行调 ...

  7. 从嘉手札<2024-1-10.2>

    我们每个人都是在受挫中成长起来的 你不能剥夺他人在受苦中获益的权利 大部分人对吃苦的含义可能理解的太肤浅了 穷并不是吃苦 吃苦的本质是长时间为了某个目标而聚焦的能力 在这个过程中放弃娱乐生活.放弃无效 ...

  8. centos环境下nginx1.19.7离线升级至1.22.1

    环境 centos7 nginx1.19.7 下载新版本nginx 下载地址:http://nginx.org/en/download.html 升级 先看一下原版本: 新安装包传至服务器,升级: # ...

  9. Docker从认识到实践再到底层原理(三)|Docker在Centos7环境下的安装和配置

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  10. go中的 4种 for循环

    package main import "fmt" func main() { // 第一种写法 for i := 1;i < 10; i++ { fmt.Println(& ...