【条款11】Handle assignment to self in operator=

【5G演进】4G到5G演进之网络架构与协议栈 4G到5G演进之网络架构与协议栈 阅读详情

在重载“operator=”时,若类中涉及到了资源的动态分配,则一定要考虑自我赋值的情况,否则容易造成内存泄露。

下面是一个不安全的示例:

class A{
public:
	A& operator=(const A& a)
	{
		delete data;
		size = a.size;
		data = new int[size];
		for(int i=0; i<size; i++)
			data[i] = a.size[i];
		return *this;
	}
private:
	int *data;
	int size;
};
当出现自我赋值的情况时,data被释放掉了,而在循环中任然会试图访问之,显然这是非法的。

改正方法是增加“证同测试”

A& operator=(const A& a)
{
	if(this == &a) return *this;
	
	delete data;
	size = a.size;
	data = new int[size];
	for(int i=0; i<size; i++)
		data[i] = a.size[i];
	return *this;
}
但是该版本可能具有“异常安全性”,因为如果分配时内存不足,会使得data指向一块被删除的内存,这样的指针式有害的。但你无法删除它,有无法读取他,很无奈。

一种解决方案是:不管“自我赋值”问题,只关注“异常安全”问题。示例如下:

A& operator=(const A& a)
{
	int *pOrigin = data;	
	size = a.size;
	data = new int[size];
	for(int i=0; i<size; i++)
		data[i] = a.size[i];	
	delete pOrigin;
	
	return *this;
}
这样,即使new操作发生异常,data仍然保持原状,指向原来的内存。

另外一种,即确保“异常安全”又确保“自我赋值安全”的一个替代方案是:copy and swap 技术。

A& operator=(const A& a)
{
	A temp(a);	//为a做了一个副本
	swap(temp);	//将*this与a的副本交换。
	return *this;
}

还有一种巧妙的方法是,利用copy assignment的实参的值传递,因为值传递会构建一个副本

A& operator=(A a)	//a是实参的一个副本
{
	swap(temp);	//将*this与a的副本交换。
	return *this;
}







锂电池主动均衡理解 锂电池主动均衡方案总结: 来自:http://wenku.baidu.com/link?url=EWiyACZ3aLPhcOjI4FZL3uQ9d0FD6dBhADQSVQiaSmRHHATTdSig1Wy39JY7-ijCzbAEYG1ymz6Lv5zhGdZaStQSHzFt6v3h3_tMrJudz9O 目前车厂采用被动均衡方案的公司:(来自网页) 目前采用主动均衡的... 阅读详情

相关推荐

运动目标成像必学:5分钟搞懂keystone变换原理与避坑指南

本文深入浅出地解析了雷达信号处理中的Keystone变换原理,它是解决运动目标距离徙动问题的关键技术。文章通过直观比喻和简化公式,阐述了该变换如何通过变量代换实现距离与慢时间的解耦合,将倾斜轨迹“掰直”,从而提升成像与检测性能。同时,文中重点指出了实际应用中关于大速度场景、插值误差、多目标处理及高阶运动补偿等关键避坑点,为工程实践提供了宝贵指南。

ios99的博客 403

C++笔记 11:在operator中处理“自我赋值“

Effective C++笔记 Handle assignment to self in operator= 别名 先调用delete 证同测试(identity test) 异常安全性(exception safety) copy and swap 总结

qq_36333986的博客 711

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 271

Effective C++ 条款11:在operator中处理自我赋值

通常我们在设计一个类并为它声明了赋值操作符时有一种状况总是需要处理——自赋值,如果用户在代码中注意避免自赋值当然可以但是那是很理想的状况,在一些复杂的情况下用户自己可能都不会意识到做了“自赋值”这个操作。例如:      *px=*py;//潜在的自我赋值       如果px和py恰巧指向同一个东西,这也是自我赋值。这些并不明显的自我赋值,是“别名”带来的结果。 我们来看一段代码: cl

qq_31984717的博客 413

电力系统设计实战:如何用ETAP绘制一次接线图并优化供电方案

本文详细介绍了如何使用ETAP软件进行电力系统一次接线图的绘制与供电方案优化。从基础环境配置到主接线拓扑构建,再到典型接线方式的对比分析与智能优化,为工业与民用电力系统设计提供实用指南。通过ETAP的可靠性分析和动态仿真功能,帮助工程师选择最优供电方案,提升系统可靠性和运维效率。

weixin_29250573的博客 206

lvgl 9虚拟键盘控件 (lv_keyboard) 使用指南

是 LittlevGL 提供的一个虚拟键盘控件,适用于在图形界面中输入文本。与按钮矩阵类似,虚拟键盘预定义了多个键位布局,支持多种模式和自定义键位映射,能够满足各种文本输入需求。通过与文本区域 (Text Area) 的结合,键盘能够自动将输入的字符传送到指定区域。控件是 LittlevGL 提供的强大虚拟键盘解决方案,适用于任何需要文本输入的界面。通过预定义的键盘模式、自定义键位映射和文本区域自动填充功能,可以大大提升用户输入体验。无论是在嵌入式系统的用户界面中,还是在其他需要虚拟键盘的应用中,

m0_62599305的博客 2186

20230103编译ToyBrick的TB-RK3588X的Andorid12的LOG07

20230103编译ToyBrick的TB-RK3588X的Andorid12的LOG07。编译环境:Ubuntu18.04.6 64位。

南岭笑笑生之家 443

【OpenClaw从入门到精通】第13篇:OpenClaw低代码编排实战:非技术人员也能玩转AI自动化流程(2026新版实测)

本文聚焦OpenClaw 2026版核心升级的低代码编排能力,针对非技术人员的实操需求,从底层逻辑、双环境部署、三类实战案例、避坑指南四个维度展开。详解阿里云集群版(企业级)与汉化本地版(个人调试)的部署步骤,通过基础数据统计、公众号内容生产线、企业级任务调度三个递进式案例,演示可视化拖拽搭建自动化流程的完整过程。全程零代码/低代码操作,配套详细参数配置、执行结果模拟及问题排查方案,帮助销售、运营、自媒体等非技术人员快速掌握自动化工具,将重复工作交给AI,提升核心工作效率。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 618

条款11(二):在operator= 中处理“自我赋值”

异常安全性&自我赋值安全性、Copy&Swap

不积跬步无以至千里 704

30.Labview如何读懂别人程序、修改程序?

之前写过一次教大家的文章,这次教大家如何学习别人的程序,和如何搭建一套适合自己的程序框架。这里事先说明一下:要想搭好程序框架,一定要先把自己的系统,逻辑是什么!这非常重要,是决定你程序的关键因素。废话不多扯,直接说重点。

关注我,更多技术问题欢迎私聊~ 2448

Autosar进阶专栏索引

Autosar进阶专栏索引

赞的博客 3542

条款11:在operator=中处理“自我赋值”

自行管理资源时,可能在停止使用资源之前意外释放了它。 class Data{...}; class Widget{ ... private: Data* pd; }; Widget&amp;amp; Widget::operator=(const Widget&amp;amp; rw) { delete pd; pd = new Data(*rw.pd); return *this; } operat...

lzhtcsw2016的博客 214

还在纠结二层交换机和三层交换机的区别?这篇文章帮你讲明白!

你好,这里是网络技术联盟站,我是瑞哥。公众号后台有小伙伴想要写一篇文章具体介绍一下二层交换机和三层交换机,此类的文章,之前写过几篇,今天瑞哥再写一篇,希望对大家有所帮助!

网络技术联盟站 4442

effective c++ 条款11 Handle assignment to self in operator=

赋值给自己,听起来有些不可思议,但是却要引起重视,它很容易把自己隐藏起来。 例如 1  a[i]=a[j];   如果 i, j的值一样? 2  *px=*py;   如果px py指向同一个object 3 rb and pd migh also be a same object. class Base { ... }; class Deri...

132

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

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

条款11:在operator=中处理“自我赋值”(Handle assignment to self in operator=.)

1)确保当对象自我赋值时operator=有良好行为。其中技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。 2)确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。

谢德军的专栏 1580

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

条款 11:在 operator= 中处理“自我赋值”(Handle assignment to self in operator=)

Effective C++之条款11

weixin_43739503的博客 390

VB摄像头监控

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

Effective C++条款11:在operator=中处理“自我赋值”(Handle assignment to self in operator=)

Effective C++条款11:在operator=中处理“自我赋值”(Handle assignment to self in operator=)

CltCj的博客 763

Item11: Handle assignment to self in operator=

Widget& Widget::operator=(Widget rhs) // rhs is a copy of the object{ // passed in — note pass by val swap(rhs); // swap *th

hfutqianwei的专栏 407

条款 11:在 operator= 中处理“自我赋值”

条款 11:在 operator= 中处理“自我赋值” Handle assignment to self in operator=. 什么是自我赋值 “自我赋值”发生在对象赋值给自己时 class Widget { ... }; Widget w; ... w = w; // 赋值给自己 // 潜在的自我赋值 a[i] = a[j]; // 潜在的自我赋值 *px = *py; // ...

?.?的专栏 290

读书笔记 ---- 在operator=中处理"自我赋值"

最近在读《Effective C++》,对里面的思想和代码深有感触,因此在此做点记录并加以自己的理解,方便以后查看。 本文内容来自条款11:在operator=中处理"自我赋值"(Handle assignment to self in operator=.)。

enchanted的博客 505

Effective C++ 11. Handle assignment to self in operator=

Handle assignment to self in operator=

ruihuank的博客 522

11.Handle assignment to self in operator =

在operator = 中处理“自我赋值” 请记住: 确保当对象自我赋值时operator = 有良好行为。其中技术包括比较“来元对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap。 确保任何函数如果操作一个以上的对象,而其中多个对象时同一个对象时, 其行为依然正确。 ...

xupeng1644的博客 1551

eclipse + gcc 报错 Assignment to itself

问题背景:将MDK环境下的ucos工程移植到eclipse环境下,出现错误:Assignment to itself  “pdata = pdata”; 原因:ucos源码这样写的原因是如果没有使用参数pdata,为了避免编译器报错就在函数开始写上这么一条语句:pdata = pdata.。 不幸的是,eclipse有对代码分析的功能,而且默认是打开了一个叫 Assignment to i

chuqierliang的博客 3157

20230103编译ToyBrick的TB-RK3588X的Andorid12的LOG10

20230103编译ToyBrick的TB-RK3588X的Andorid12的LOG10。编译环境:Ubuntu18.04.6 64位。

南岭笑笑生之家 1753

msdn关于右值引用的讲解以及右值构造函数的写法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33964094的博客 249

在nios ii中编译遇到Assignment to itself ‘ptcb = ptcb‘的解决办法

当 Assignment to itself ‘ptcb = ptcb’ 问题出现在 OSTaskCreateHook 函数中,这个赋值本身是为了屏蔽编译器 “未使用参数” 警告的常规写法,但被静态代码分析工具误判为 “自身赋值错误”。写 ptcb = ptcb 是传统做法:目的是告诉编译器 “我用到了这个参数”,避免弹出 “unused parameter ‘ptcb’” 警告;(void)ptcb;屏蔽未使用参数警告,无自身赋值问题。简单说:这行代码是 “旧方案解决旧警告,却触发了新工具的新警告”。

3有青年的博客 259
上一篇: 【条款10】Have assignment operators return a reference to *this
下一篇: 【条款12】Copy all parts of an object
traceorigin
博客等级 码龄15年 38粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值