C++构造函数之深度复制(deep copy)

C++ deep copy 深度拷贝 当类的成员变量存在指针类型时,如果采用赋值语句将一个该类对象赋给另外一个对象时,默认会采用浅拷贝,也即两个指针类型的成员变量指向同一个地址,这样当对象生命周期结束时会调用析构函数,释放相应的内存地址。但是由于浅拷贝,会导致释放发生两次,如此第二次释放发生时,因为已经被释放过一次,所以程序会奔溃。代码如下: #include <iostream> #include <string> class String{ private: char* m_Buffer; unsigne 阅读详情

C++字符串作为类成员时,直接的复制很可能导致两个指针指向同一内存区域,析构时将引发未知错误

本文介绍下处理方法:

#ifndef INHERITANCE_H_
#define INHERITANCE_H_
#include <iostream>
using namespace std;
class Father
{
	
public:

	Father(char* str="NoName");//默认构造函数显示声明
    Father(const Father& f);//默认复制构造函数显示声明,必须显示声明,进行深度复制才能解决多个指针指向同一内存区域的问题
	virtual~Father();
	static int m_nCount;//静态成员,记录当前对象的数目
	void ShowCount()const;//显示当前对象数目
	void Show()const;//显示当前对象的信息
	friend ostream& operator<<(ostream& os,Father& f);
private:
	char* pName;//对象名
	int m_nLength;//对象名的长度

};
int Father::m_nCount=0;
ostream& operator<<(ostream& os,const Father& f)
{
	f.Show();
	return os;
}
Father::Father(char* str):pName(NULL)
{
	cout<<"Father类的默认构造函数被调用"<<endl;
	m_nCount++;
	m_nLength=strlen(str);
	if(m_nLength==0)
	{
		pName="NoName";
		return;
	}
	pName=new char[m_nLength+1];
	strcpy(pName,str);//strncpy,memcpy等也可以实现
}
Father::Father(const Father& f)//深度复制deep copy
{
	cout<<"Father类的复制构造函数被调用"<<endl;
	m_nCount++;
	m_nLength=f.m_nLength;
	pName=new char[m_nLength+1];
	strcpy(pName,f.pName);
}
Father::~Father()
{
	cout<<"Father类的析构函数被调用"<<endl;
	m_nCount--;
}
void Father::Show()const
{
	cout<<"当前对象名是:"<<pName<<endl;
	cout<<"对象名长度为:"<<m_nLength<<endl;
}
void Father::ShowCount()const
{
	cout<<"当前对象数目为:"<<m_nCount<<endl;
}

#endif;

未完待续

H3C设备VRF配置实战:5步搞定多业务网络隔离(附排错技巧) 本文详细介绍了在H3C设备上配置VRF(虚拟路由转发)实现多业务网络隔离的实战方法。通过五步配置流程,从创建VPN-instance、绑定接口到配置独立路由表,帮助网络工程师在单台设备上构建逻辑隔离的企业级网络,并分享了高级路由配置与常见排错技巧。 阅读详情

相关推荐

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。

大胡子大叔的专栏 2万+

【深入理解C++】浅拷贝与深拷贝

1.前置知识 2.浅拷贝 3.深拷贝 4.总结

脚踏实地,仰望星空 2546

OpenVINS实战指南:从环境搭建到RGB-D相机实时建图

本文提供了一份详细的OpenVINS实战指南,涵盖从Ubuntu与ROS环境搭建、依赖安装与编译调试,到连接RGB-D相机进行实时建图的完整流程。重点解决了RealSense D435i等设备的驱动配置、话题对齐及常见问题,并分享了传感器标定与性能优化技巧,帮助开发者快速实现稳定高效的视觉惯性里程计系统。

weixin_29201313的博客 483

在C++中如何copy一个对象,进行深copy

在C++中如何copy一个对象,进行深copy 修改拷贝后的对象不影响之前的对象,如何操作? 在C++中进

Kp0fS的草稿纸 1622

基于python的奥运会历史数据分析【120年】

数据分析实战案例

xff123456_的博客 3338

013:无人机航线规划的概念

航线规划是无人机任务规划的核心环节,它决定了无人机在整个任务执行过程中的飞行路径。航线规划需要考虑多种因素,包括飞行时间、飞行距离、能源消耗、飞行安全等。

qq_31762031的博客 2443

c++中对象的深拷贝代码示例与详细解释

深拷贝是一种拷贝对象的方法,它会复制对象的所有成员变量,并在新对象中创建独立的副本。这样,原对象和新对象之间的数据是相互独立的,修改其中一个对象的数据不会影响另一个对象。这证明了深拷贝的效果:修改一个对象的数据不会影响另一个对象。每个对象都拥有自己的独立内存空间,存储了各自的数据。// 使用深拷贝构造函数进行拷贝,创建新对象 obj2。的数据,确认它们是相互独立的。的数据仍然保持不变,即仍为初始值 5。// 修改 obj1 的数据。// 分别输出两个对象的数据。对象的数据复制到新的内存中。

weixin_50531046的博客 692

磁悬浮分子泵:起源、现状与未来趋势深度解析

摘要 磁悬浮分子泵作为高真空获取的关键设备,通过磁悬浮技术实现转子无接触高速运转,大幅提升了真空系统的性能和可靠性。本文系统梳理了分子泵从机械轴承到磁悬浮的技术演变历程,分析了当前行业格局及主要厂商产品特性,包括爱德华兹、普发真空等国际巨头的技术优势。研究进一步探讨了磁悬浮分子泵在半导体制造、科研设备等领域的核心应用,通过数学模型揭示了其性能参数关系。最后,展望了未来在智能化、节能化等方面的发展趋势,为相关领域的技术创新提供参考。 关键词:磁悬浮分子泵;高真空技术;半导体制造;科研设备;技术发展

技术工作者 690

c/c++ 深拷贝和浅拷贝

c/c++深拷贝和浅拷贝

世界那么大,我想去看看~【随心更新,看世界去了😄】 1822

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2108

MIKE水动力笔记17_MIKE文件转shp、统计每个单元格的面积

MIKE的工具箱中自带一个转shp的工具,然后可以拖进ArcGIS中很方便的统计每个单元格的面积和每个网格点的水深。

晏长街的博客 4151

C/C++修炼之道01——复制构造函数(copy constructor)

定义:       只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。 使用方式: (1)显示使用----用一个同类型的对象初始化该对象时; (2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。 三种类型的复制构造函数: *bitwise copy constructor :逐位复制-----默

倔强的_Yang的专栏 1064

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 364

shallow copy and deep copy

shallow copy and deep copy(浅拷贝与深拷贝) C++03性能上长期被诟病的原因有一点就是其耗时且不必要的深度拷贝。 简单的理解就是浅拷贝就是拷贝指针,深拷贝就是重新分配内存拷贝数据 The default copy constructor     and default assignment operators do shallow copies, which

coderlang 1205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++ 移动构造函数与移动赋值运算符:使用场景与深度解析

移动构造函数和移动赋值运算符是现代 C++ 中不可或缺的性能优化工具。管理堆内存的类(如自定义字符串、动态数组):将 O(n) 的深拷贝优化为 O(1) 的指针交换。管理独占资源的类(如文件句柄、网络连接、互斥锁):这些资源本身不可复制,移动语义是传递所有权的唯一方式。包含不可复制成员的类(如):成员不可复制,类本身也必须依赖移动语义实现传递。需要存入标准库容器的自定义类型:容器的扩容、插入等操作会大量使用移动来避免昂贵拷贝。核心原则可以浓缩为一条。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 714

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

《C++ 类的构造函数深度解析:默认、拷贝与移动的选型逻辑》

在C++编程中,构造函数是类设计的核心环节,它直接关系到对象的创建、初始化和资源管理。合理选择构造函数类型,能显著提升代码的健壮性和性能。本文将从基础概念出发,逐步解析默认构造函数、拷贝构造函数和移动构造函数,并深入探讨其选型逻辑。文章包含原创代码示例,帮助读者掌握实际应用技巧。构造函数是类中用于初始化对象的特殊成员函数,其名称与类名相同,无返回类型。默认构造函数(Default Constructor)是不带参数的构造函数,当对象被默认初始化时调用。如果未显式定义,编译器可能自动生成一个隐式版本,但后者可

gshjvklkl的博客 380

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

编译器合成复制构造函数

定义:       只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。 使用方式: (1)显示使用----用一个同类型的对象初始化该对象时; (2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。 三种类型的复制构造函数: *bitwise copy constructor :逐位复制-----默认方式 *合成的 co

鱼思故渊的专栏 1512

深度复制和浅度复制

1.基本概念:        首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy)。       a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用。       b.深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。       我们知道,在C+

上帝之手 1万+

Java 深拷贝(Deep Copy)与浅拷贝(Shallow Copy)

文章摘要: 浅拷贝仅复制对象本身,基本类型字段独立,引用类型字段共享内存地址,修改会影响原对象;深拷贝递归复制所有引用对象,新旧对象完全独立。浅拷贝内存开销小、性能高但实现简单,深拷贝开销大、实现复杂(需递归处理或序列化)。默认Object.clone()是浅拷贝,实现深拷贝需手动处理引用字段或借助序列化。浅拷贝适用于不可变对象或性能优先场景,深拷贝用于需要完全独立对象的场景。

NeoLshu的博客 869

C++拷贝构造函数:从浅拷贝陷阱到深度拷贝实现

在C++面向对象编程中,拷贝构造函数是管理对象复制行为的核心机制。其原理决定了当一个对象用于初始化另一个同类型对象时,编译器如何处理成员数据的复制。对于包含动态内存、文件句柄等资源的类,默认的浅拷贝仅复制指针地址,会导致多个对象共享同一资源,引发内存泄漏、数据篡改甚至程序崩溃等严重问题。通过实现深度拷贝,即复制指针所指向的实际资源,并结合析构函数与拷贝赋值运算符遵循“三/五法则”,可以构建资源安全的类。这一技术在高性能服务器、游戏引擎等需要精细内存管理的应用场景中尤为重要。本文以动态数组和字符串类为例,深入

weixin_34414196的博客 383

C++ 拷贝构造函数深度解析:从浅拷贝到深拷贝

本文系统介绍了C++中的拷贝构造函数,重点讲解了浅拷贝和深拷贝的区别与应用。浅拷贝会直接复制指针地址导致内存共享,而深拷贝则为指针成员分配独立内存。文章详细分析了拷贝构造函数的调用时机、实现方式,以及编译器默认行为可能带来的问题。通过具体代码示例展示了深拷贝的正确实现方法,并总结了"三/五法则"等最佳实践。最后指出当类包含指针成员或管理资源时,必须自定义拷贝构造函数以避免内存错误。理解拷贝构造函数是掌握C++资源管理的关键。

2502_93300404的博客 386

C++拷贝构造与赋值操作深度解析

指向动态分配内存的指针 (T*这是最常见的情况。文件句柄 (FILE*或其他需要独占访问的资源。网络套接字 (SOCKET或其他系统资源句柄。引用计数指针 (如虽然智能指针本身管理深拷贝,但自定义类如果包含它们,也需要考虑其拷贝语义(通常是浅拷贝指针本身,但增加引用计数)。其他需要独立副本的资源。如果一个类需要自定义析构函数(通常因为它需要释放资源),那么它通常也需要自定义拷贝构造函数和赋值运算符。因为默认的浅拷贝行为在管理资源时会导致问题。特性拷贝构造函数赋值运算符浅拷贝深拷贝目的。

q_438141的博客 374

RPCS3免费PS3模拟器指南:30分钟从装固件到跑起第一局

RPCS3 是目前最成熟的免费开源 PlayStation 3 模拟器,Windows、Linux、macOS 都能跑,本体不收费,也不需要任何付费会员。但它有个绕不开的前置步骤——必须先装一份 PS3 官方固件,否则任何游戏都启动不了。这篇指南按"先判断够不够格 → 走最短路径跑通一次 → 卡住了按症状查"的顺序展开,跟着走就能把第一局开起来。 ## 动手前30秒:先对一下这台机器 别急着下

gitblog_00720的博客 479

42.C++拷贝构造函数以及深拷贝浅拷贝

在C++中,拷贝构造函数(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象并将其初始化为与现有对象相同的副本。拷贝构造函数通常用于以下情况:当使用一个对象来初始化另一个对象时。当将对象作为函数参数按值传递时。当从函数返回对象时。拷贝构造函数的参数是一个常引用(const reference),参数名通常是other或source等表示源对象的名称。在拷贝构造函数内部,你需要根据需要将源对象的成员变量拷贝到新对象中。可以使用其他构造函数或直接对成员变量进行赋值操作。

weixin_63779802的博客 901

深拷贝与浅拷贝(Deep Copy and Shallow Copy)

什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy) a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用。 b.深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象。 我们知道,在C++中有拷贝构造函数和拷贝赋值函数的概念。浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给...

weixin_34043301的博客 78
上一篇: C++基础——操作符重载
下一篇: MFC模拟双色球抽奖
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值