越学越糊涂 C++ 重载拷贝操作符

Citron__ 2017-12-27 06:18:01
刚开始看见重载拷贝操作符的时候,我是这样写的

Test& operator = (const Test& t ){
a = t.a;
*(p) = *(t.p);
return *this;
}

然后正确的代码是

Test& operator =(const Test& str)//赋值运算符
{
if (this != &str)
{
if (name != NULL)
delete name;
this->id = str.id;
p=new string(*str.p);
}
return *this;
}

可能很白痴的问题,。。
这里为什么要先delete在new呢,为什么不直接拷贝指针指向内存里面的值呢?请问我第一种写法会带来什么结果呢,,,测试了下好像通过了。。
...全文
527 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
eeeeelin 2018-01-13
  • 打赏
  • 举报
回复
先delete再new,为了防止自我复制
TerryHHl 2018-01-11
  • 打赏
  • 举报
回复
刚刚看到 p = new int; *(p) = *(t.p); 前面要重新分配一下空间. 不然 两个对象指向同一个内存. 这是没问题. 但是释放的时候就重复释放 出错 如果一个类中只存在一个参数为 X& 的拷贝构造函数,那么就不能使用const X 的对象实行拷贝初始化
大风哉 2018-01-09
  • 打赏
  • 举报
回复
引用 12 楼 wh_2396 的回复:
你不适合做开发
不要这么打击人家嘛,可能人家还没悟通呢
boot_black 2018-01-09
  • 打赏
  • 举报
回复
我是个c++新手,我也楼主这样的疑惑。 这里有个前提:如果要删除的对象和我们申请的对象类型相同,并且所需的内存大小也相同(这里假设都是使用堆内存)。 那么,先释放这块内存,然后重新申请大小相同的内存似乎显得有些多余。 我觉得:直接修改当前内存并返回似乎也能完成工作。 不知道我描述的是否清楚,也恳请赐教。
xskxzr 2018-01-04
  • 打赏
  • 举报
回复
p可能是空指针。
Citron__ 2018-01-02
  • 打赏
  • 举报
回复
引用 2 楼 lovesmiles 的回复:
你这个name和p是什么关系?name看起来是个指针,如果它要指向新的内存,旧的内存肯定得删除先。 不处理旧内存,会造成内存泄漏
谢谢回答,我想问的是为什么不直接修改指针原本指向的内存里面的值,而是要先delete,然后new 一个新的。
Citron__ 2018-01-02
  • 打赏
  • 举报
回复
引用 1 楼 hdt 的回复:
如果前任的尺寸不符呢?
嗯,是有可能不符合,不过不符合的情况只存在于数组的情况吧
Citron__ 2018-01-02
  • 打赏
  • 举报
回复
不好意思,有点粗心,name应该是p。我不明白的是,string 这个类里面,应该实现了 赋值操作符,也就是说 string a="1"; a="123"; string 所重载的 operator= 已经是实现了当size不同的时候,先delete所申请的空间,然后再new一个新的对象。 也就是说我们在使用string *p的时候,为什么在重载operator= 的时候,不直接 *p= * (t.p), 而是 delete p; p=new string(*t.p); ,我认为需要这样干的,应该是一个数组吧。比如char *,是这样么。
「已注销」 2018-01-02
  • 打赏
  • 举报
回复
每个对象自己的内存自己申请自己释放,指向别人传进来的内存是什么道理?这不是 Java。
wh_ 2018-01-02
  • 打赏
  • 举报
回复
你不适合做开发
赵4老师 2017-12-28
  • 打赏
  • 举报
回复
《C++编程思想》
大风哉 2017-12-28
  • 打赏
  • 举报
回复
楼主上下文没有交代清楚,看得比较晕
棉猴 2017-12-28
  • 打赏
  • 举报
回复
《C++中类的构造函数与拷贝构造函数》 http://blog.csdn.net/hou09tian/article/details/70844690 《C++中拷贝构造函数与拷贝赋值操作符》 http://blog.csdn.net/hou09tian/article/details/77483175 希望能够帮到你
paschen 版主 2017-12-28
  • 打赏
  • 举报
回复
delete的是name,new的是string,里面怎么实现取决于你的类,如赋值的字符串需要的空间和现在的不同,就要先delete再new,当然你可以全用等号直接赋值,相当于是一个浅拷贝
幻夢之葉 2017-12-27
  • 打赏
  • 举报
回复
拷贝赋值函数,作用的对象肯定是一个已经存在的对象 以上这个你应该是明白的 自身申请内存,通常来说自身也应该释放掉的(如果始终不释放,会导致内存泄漏) 你的作用是指向另一个对象的一块动态内存,假如那个对象销毁的时候也释放掉自身申请的内存 那么明显会导致你前者对象成员所指向的内存是一块已经释放掉的,程序极高概率出问题 所以此处你的析构函数应该有如下代码(你程序代码是否有误,p和name是同一个吗?) delete name; 你可能不明白的一个点是:对于成熟或者产品来说,内存泄漏Bug是非常严重的问题(虽然并不一定会导致很严重的结果) 程序退出,操作系统会回收所有该程序申请的内存(包括你没有进行手动释放的),但是程序假如频繁内存泄漏,会导致占用资源急剧上升 又诸如服务端程序,可能需要长时间运行,每次一点点的内存泄漏都是难以接受的
AlbertS 2017-12-27
  • 打赏
  • 举报
回复
变量name和p有关系吗?如果是一个,应该是考虑到新的字符串可能大于旧字符串的缓冲区,所以要按照新的长度重新申请
勤奋的小游侠 2017-12-27
  • 打赏
  • 举报
回复
你这个name和p是什么关系?name看起来是个指针,如果它要指向新的内存,旧的内存肯定得删除先。 不处理旧内存,会造成内存泄漏
真相重于对错 2017-12-27
  • 打赏
  • 举报
回复
如果前任的尺寸不符呢?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧