C++ 深拷贝浅拷贝
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++ 深拷贝浅拷贝的更多相关文章
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- JavaScript之深拷贝&浅拷贝
深拷贝&浅拷贝,说起来都明白,但是说不出所以然.今天就系统的整理下思绪,一点点的将其分析出所以然 废话不多说 浅拷贝 简单的说就是一个值引用,学生时代接触过编程的人都应该了解过指针,浅拷贝可以 ...
- 【opencv】imread 赋值 深拷贝浅拷贝
import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...
- Java基础 深拷贝浅拷贝
Java基础 深拷贝浅拷贝 非基本数据类型 需要new新空间 class Student implements Cloneable{ private int id; private String na ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- JS Object Deep Copy & 深拷贝 & 浅拷贝
JS Object Deep Copy & 深拷贝 & 浅拷贝 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Refe ...
- Map拷贝 关于对象深拷贝 浅拷贝的问题
问题:map拷贝时发现数据会变化. 高能预警,你看到的下面的栗子是不正确的,后面有正确的一种办法,如果需要看的话的,请看到底,感谢各同学的提醒,已做更正,一定要看到最后 先看例子: ...
- clone 深拷贝 浅拷贝
1. 定义:知道一个对象,但不知道类,想要得到该对象相同的一个副本,在修改该对象的属性时,副本属性不修改,clone的是对象的属性 2. 意义:当一个对象里很多属性,想要得到一个相同的对象,还有set ...
- Python深复制浅复制or深拷贝浅拷贝
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...
随机推荐
- echarts的初始化和销毁dispose
容器节点被销毁以及被重建时 假设页面中存在多个标签页, 每个标签页都包含一些图表. 当选中一个标签页的时候,其他标签页的内容在 DOM 中被移除了. 这样,当用户再选中这些标签页的时候,就会发现图表& ...
- click与addEventListener和removeEventListener事件与移除正确的移除事件详解
1. onclick事件 es5 普通事件就是直接触发事件,相同的事件会被覆盖掉.代码如下: let demoDiv=document.querySelector(".demo") ...
- 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 为了提升性能,使用 unsafe 代码来重构了凯撒加密的代 ...
- 解决问题:ACM-Reference-Format使用这个style后,文献引用顺序和正文不一致
解决问题:latex中bib引用顺序不正确,引用顺序和正文不一致_丨汀.的博客-CSDN博客问题:生成pdf时文献应用会乱序引用bib格式的参考文献时,会这么写:\bibliographystyle{ ...
- 4.8 C++ Boost 应用JSON解析库
property_tree 是 Boost 库中的一个头文件库,用于处理和解析基于 XML.Json 或者 INFO 格式的数据. property_tree 可以提供一个轻量级的.灵活的.基于二叉数 ...
- 从嘉手札<2023-11-13>
1. 很多时候 成功并不等同于成长 成功是很多因素复合形成的一种结果 而并不等同于一个人阅历的丰富.认知的提高 2. 我一直认为 世界不属于投机者 也不属于堕落者 信念感在这个大数据泛滥.碎片化汹涌的 ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第7章)-- 读书笔记(中)
第 7 章 高级主题 7.2 并发 当两个用户获取同一个资源后,再同时修改该资源,就会导致并发问题 常见实现并发的方法有以下两种: 保守式并发控制,每次修改资源,都锁定资源 开放式并发控制,每次修改资 ...
- Centos7部署django+uwsgi+nginx 转载: https://www.cnblogs.com/wztshine/p/16172154.html
Centos7部署django+uwsgi+nginx Django + uwsgi + nginx on Centos7 wsgi 介绍 本小节来自 廖雪峰 wsgi 一文 一个Web应用的本质 ...
- 用STM32F401和nRF24L01制作无线调速小车
硬件配置 在做这个小项目前, 考察过STM32F103C8T6, STM32F401CCU6和STC89C52这三个MCU, 并实际跑了一些用例 STC89C52在代码上要简单得多, 它的问题是没有A ...
- 【Unity3D】同步Socket通讯
1 前言 在多人对战网络游戏中,玩家之间一般不是直接通讯,而是与服务器通讯,服务器再把消息转发给其他玩家.网络通讯一般基于 Socket 实现,也有一些开源网络游戏框架,如:光子引擎 Photon ...