鱼C论坛

 找回密码
 立即注册
查看: 5250|回复: 8

[技术交流] 关于副本构造器和赋值运算符的重载

[复制链接]
发表于 2013-7-25 00:11:03 | 显示全部楼层 |阅读模式
1鱼币
欢乐的小甲鱼 和 各位鱼油同志们大家晚上好:

我今天在调试一个小甲鱼写的程序是发现了一个问题(就是关与指针的那些事)
,小甲鱼是用code::block完成运行的(视频中小甲鱼没有错误),我用的是vs2012(发现了一个错误)

错误是,在对象没有初始化之前,调用副本构造函数,副本构造函数呢又去调用赋值重载函数,在重载函数中做有一句话是这样写的:delete ptr;(类中有定义语句:int *ptr;)
这问题就来了,这个指针还没有初始化,能进行释放吗?

希望 能得到小甲鱼老师和广大鱼油的给力支持。

最佳答案

查看完整内容

{:7_154:}刚才又深思了一下大概是这样:delete ptr ; ptr = new int; 这样的设定就是为了同时满足未初始化和已经初始化的对象的要求。 已经初始化的指针完全没必要执行这两句。可以直接*ptr=*rhs.ptr; 而未初始化的ptr只是声明了一个指针,并没有指向有效地址。所以必须要给他一句ptr=new int;(他不需要delete ptr,但是加上也不妨碍)。 而如果有了ptr=new int就与已经初始化的ptr有矛盾。所以要先将已经初始化的ptr ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 00:11:04 | 显示全部楼层
本帖最后由 Potato丶 于 2013-7-25 10:13 编辑

{:7_154:}刚才又深思了一下大概是这样:delete ptr ;  ptr = new int; 这样的设定就是为了同时满足未初始化和已经初始化的对象的要求。

已经初始化的指针完全没必要执行这两句。可以直接*ptr=*rhs.ptr;

而未初始化的ptr只是声明了一个指针,并没有指向有效地址。所以必须要给他一句ptr=new int;(他不需要delete ptr,但是加上也不妨碍)。

而如果有了ptr=new int就与已经初始化的ptr有矛盾。所以要先将已经初始化的ptr指向的内容释放(delete ptr),再执行ptr=new int;

大概就是这样吧- -
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 00:11:54 | 显示全部楼层
第一次提问 发现语无伦次 忘见谅哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 00:49:29 | 显示全部楼层
本帖最后由 Potato丶 于 2013-7-25 00:52 编辑

{:7_154:}我刚看到那。还没看。
大概看了下代码。
你说的重载赋值运算符中的delete ptr是正确的。因为在构造函数中已经指定了ptr=p;
也就是说已经间接进行了初始化。不知道对否。困出翔。睡觉了。明天起来再看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 08:54:09 | 显示全部楼层
只要不对同一地址delete两次,都不会崩的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 08:58:04 | 显示全部楼层

谢谢 您的回复哈。我的意思是当我们使用Myclass obj2 = obj1;时会调用副本构造函数,如果在副本构造函数中有delete ptr;语句的话不就会出现指针悬挂的问题了吗?(ps:但是小甲鱼用code::block的时候就没有出现问题,很是奇怪!!!)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 09:04:41 | 显示全部楼层
魔火 发表于 2013-7-25 08:54
只要不对同一地址delete两次,都不会崩的

那如果是没有进行初始化的指针呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-25 09:27:06 | 显示全部楼层
许许 发表于 2013-7-25 09:04
那如果是没有进行初始化的指针呢?

编译器应该在定义该指针的同时就赋予了它一个地址,它是一个随机地址这就是野指针的概念吧,就比如定义了一个整型变量,用printf输出其值是一个随机数一样
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 15:12:16 | 显示全部楼层
魔火 发表于 2013-7-25 09:27
编译器应该在定义该指针的同时就赋予了它一个地址,它是一个随机地址这就是野指针的概念吧,就比如定义了 ...

同样 非常感谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-21 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表