鱼C论坛

 找回密码
 立即注册
查看: 1354|回复: 4

[已解决]【提问】关于new和delete

[复制链接]
发表于 2019-5-29 11:30:13 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
new返回的是一个指针然后delete也是接收一个指针,如果这样
Test t = *(new Test());
delete &t;
会崩溃,求解
最佳答案
2019-5-29 13:42:47
首先要清楚new和delete是分别做什么的:
new是用来动态创建一个对象,而delete是用来删除一个动态对象。必须要注意new和delete是对应的,一个用来创建,一个用来删除。

而你遇到的问题是什么呢。解析如下:
Test t = *(new Test());      
这句话你首先是new了一个Test对象,然后用*号获取对象指针中的实际对象内容,然后再将其拷贝给t。

其中很关键的一点是,*(new Test())赋值给t调用的是构造函数进行内容拷贝。也就是说,t和new Test()是两个独立的对象。
而t是一个局部变量,也就是说t的数据是在栈中保存着。而new Test()是动态创建的,数据是在堆中保存着的。
那么接下来的delete &t;是程序崩溃的最终语句。
因为t是一个局部变量,并不是由new创建的。delete删除t就会直接导致内存崩溃。

所以,下面是以后编程必须要特别留意的:
1.局部变量t不是一个指针,而是一个真实存在于栈空间中的对象,是无法用delete进行删除的!
2.delete只能用于删除new创建的对象。包括类似的c语言中的malloc和free也是同理,他们都是一一对应的方法。不可交叉乱用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-29 11:51:34 | 显示全部楼层
Test t = *(new Test());
执行的是拷贝构造函数。按照楼主的思想。

Test *pt = new Test();
Test t = *pt;
delete &t;
这样合理吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-5-29 13:42:47 | 显示全部楼层    本楼为最佳答案   
首先要清楚new和delete是分别做什么的:
new是用来动态创建一个对象,而delete是用来删除一个动态对象。必须要注意new和delete是对应的,一个用来创建,一个用来删除。

而你遇到的问题是什么呢。解析如下:
Test t = *(new Test());      
这句话你首先是new了一个Test对象,然后用*号获取对象指针中的实际对象内容,然后再将其拷贝给t。

其中很关键的一点是,*(new Test())赋值给t调用的是构造函数进行内容拷贝。也就是说,t和new Test()是两个独立的对象。
而t是一个局部变量,也就是说t的数据是在栈中保存着。而new Test()是动态创建的,数据是在堆中保存着的。
那么接下来的delete &t;是程序崩溃的最终语句。
因为t是一个局部变量,并不是由new创建的。delete删除t就会直接导致内存崩溃。

所以,下面是以后编程必须要特别留意的:
1.局部变量t不是一个指针,而是一个真实存在于栈空间中的对象,是无法用delete进行删除的!
2.delete只能用于删除new创建的对象。包括类似的c语言中的malloc和free也是同理,他们都是一一对应的方法。不可交叉乱用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 16:41:46 From FishC Mobile | 显示全部楼层
感谢感谢,讲的很浅显易懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 16:42:56 From FishC Mobile | 显示全部楼层
谢谢,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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