✦双11狂欢大促✦
盲盒赢 定制羽绒服
开启惊喜盲盒,抽取你的专属好礼
✦
立即开盒 ›
中奖列表 ›
— 惊喜奖品抢先看 —
超级年卡50元券
周边70元券
手机支架
一拖三数据线
雨伞
运动毛巾
电动牙刷
VIP月卡
机械键盘
定制羽绒服
超级年卡50元券
周边70元券
手机支架
一拖三数据线
雨伞
运动毛巾
电动牙刷
VIP月卡
机械键盘
定制羽绒服
社区 >C++ 语言 >帖子详情 为什么要防止自身赋值? 2008-07-10 02:47:35 277 阅读 AI 写同款 · GEO 优化AI 选题数据监测一键分发 › shiosank 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网
我也要 → 关注 + 加入社区 深拷贝,浅拷贝,赋值操作符的技术要点总结 写这篇文章的目的是因为这两天,遇到一个复制操作指针的问题(在一个列表里,存放的是指针变量,想通过右击鼠标实现复制操作),生成的新变量和源变量都是指向同一个地址,改变其中一个都会影响另一个,这样操作明显是不符合要求的。
网上找了资料,问了网友,后来回顾一下自己的寻问过程,发现自己很傻逼,不堪回首啊,后面还是要把C++Parimer找出来看啊。左思右想,还是把这个过程写下来,是一种记录,更是一种反思。
问题起因:
... 阅读详情
Q1:我们在定义复制操作符的时候,为什么要防止自身赋值?
Q2:如果不的防止话,会造成什么样的后果?
...全文
配置赞助广告取 消
确 定
Verilog中的阻塞与非阻塞赋值 在Verilog HDL语言中,信号有两种赋值方式,即阻塞赋值和非阻塞赋值。
1、阻塞(Blocking)赋值(如 b = a)
阻塞赋值,顾名思义,即在一个always块中,后面的语句会受到前语句的影响,具体来说,在同一个always中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被“阻塞”。在一个过程块内多个阻塞赋值语句是顺序执行的。
赋值语句执行完后,块才结束。
b的值在赋值语句执行完后立刻就改变的。
每条语句执行之后才能执行下一条语... 阅读详情 相关推荐
换一换
安全风险评估之信息资产赋值.pdf
以下是对信息资产赋值的详细解析:1. 为什么进行信息资产赋值?信息资产赋值是为了量化资产的价值,这不仅包括资产本身的购买和维护成本,还涵盖了资产丧失可能导致的业务影响。
m0_64343774 java 中的封装介绍及使用方法
六、为什么需要构造方法?为属性赋值时,很容易忘记对其中的一项或多项进行赋值。构造方法可以简化对象初始化,为实例变量赋值。七、带参数的构造方法:可以显示地为实例变量赋予初始值。
weixin_38680340 java中封装的实现方法详解
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。为什么要进行封装?
weixin_38747444 C++箴言:让=返回一个this的引用
本文将深入探讨为何让赋值运算符`=`返回一个指向`this`的引用是一个优秀的编程实践,并解释这种做法背后的原因。#### 为什么让赋值运算符返回`this`引用?
weixin_38711149 OC-NSString为什么用copy修饰而不是用strong
当我们处理NSString这类对象时,经常会遇到一个问题:为什么在定义属性时,NSString通常用`copy`关键字而不是`strong`?
冯汉栩 11 为什么要防止自身赋值? Q1:我们在定义复制操作符的时候,为什么要防止自身赋值? Q2:如果不的防止话,会造成什么样的后果? 复制链接
扫一扫 举报 打赏 shiosank C++ 语言 · 65,214 成员 · 250,514 内容 + 关注 + 加入社区
评论 11 切换为时间正序 raoul 2009-06-08 打赏举报 回复 赋值时需删除左操作数,并在撤销左操作数的成员之后,将右操作数的成员赋值给左操作数的相应成员。如果对象是相同的,则撤销左操作数的成员也将撤销右操作数的成员! fallening 2008-07-11 打赏举报 回复 [Quote=引用 2 楼 ouyh12345 的回复:]
一般在拷贝的时候,先把原来的指针delete掉,再按新的大小new一个指针
如果自身拷贝,把原来的指针delete掉后,数据就没了,而且可能导致野指针
[/Quote]
copy&swap貌似可以搞定这个问题 fallening 2008-07-11 打赏举报 回复 但是Exceptional C++貌似并不推荐这么做。
在Object Lifetimes - Part II这一章有提起这种做法6大罪状
Problem #1: It Can Slice Objects
Problem #2: It's Not Exception-Safe
Problem #3: It's Inefficient for Assignment
Problem #4: It Changes Normal Object Lifetimes
Problem #5: It Can Still Break Derived Classes
Problem #6: It Relies on Unreliable Pointer Comparisons
它给出的建议是
prefer writing a common private function to share code between copying and copy assignment, if necessary; never use the trick of implementing copy assignment in terms of copy construction by using an explicit destructor followed by placement new, even though this trick crops up every three months on the newsgroups
大家都是怎么看的? fqyaustin 2008-07-11 打赏举报 回复 加为好友
发送私信
在线聊天
* ouyh12345
* 五岭散人
* 等级:
发表于:2008-07-10 14:56:232楼 得分:0
一般在拷贝的时候,先把原来的指针delete掉,再按新的大小new一个指针
如果自身拷贝,把原来的指针delete掉后,数据就没了,而且可能导致野指针
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正解 shiosank 2008-07-10 打赏举报 回复 谢谢大家,基本理解! yc_8301 2008-07-10 打赏举报 回复 板凳。。学习了。。。 xkyx_cn 2008-07-10 打赏举报 回复 如果有资源分配释放工作,出现自赋值时,先将资源释放,后面再使用这些资源来进行赋值,你说会出现什么后果?
K行天下 2008-07-10 打赏举报 回复 深拷贝简单地说就是使被拷贝的类对象和拷贝对象各自拥有独立的内存空间,因为如果不是的话,当你拷贝指针时,只会拷贝指针值,
不会给被拷贝类对象独立重新分配一段内存,这样2个对象就各自拥有了一个指针他们指向同一片内存。
拷贝构造函数往往要释放掉自己的空间,然后重新开一片内存适应拷贝大小,这样的情况你能自拷贝吗? zeroczh 2008-07-10 打赏举报 回复 就好像定义一个Int对象一样 在局部内定义是没有初始化的,其值是不可预知的
int a=a;这样,在的值是未知的 ouyh12345 2008-07-10 打赏举报 回复 一般在拷贝的时候,先把原来的指针delete掉,再按新的大小new一个指针
如果自身拷贝,把原来的指针delete掉后,数据就没了,而且可能导致野指针 taodm 2008-07-10 打赏举报 回复 先问一个相关的先决知识:什么是深拷贝?