社区
C++ 语言
帖子详情
C++ 在一个函数中new出一个对象,在某个时间点在另一个函数中delete,会有什么风险吗??
Mike_God
2016-01-19 08:38:37
RT,如果有风险的话,可以有什么更好的方法吗??
...全文
442
13
打赏
收藏
C++ 在一个函数中new出一个对象,在某个时间点在另一个函数中delete,会有什么风险吗??
RT,如果有风险的话,可以有什么更好的方法吗??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
qq120848369
2016-01-22
打赏
举报
回复
异步程序 或者 多线程程序 常用shared_ptr维护共享资源的生命期。
10km
2016-01-22
打赏
举报
回复
必须有风险,一般在设计的时候还是要坚持谁申请谁释放的原则。除非万不得已。 举个极端的例子: 你的A,B两个函数分别在X和Y两个不同的DLL中。 用A函数申请了一块内存,在B函数中释放。所有的代码都调试通过,逻辑没问题了,也没有内存泄露,皆大欢喜。 过了一阵子,为了提高X dll的性能,你对X用了内存池(tcmalloc)。这样所有X DLL中的内存分配都被内存池接管,函数A也不例。。。编译正常通过。 但你再进行系统联调的时候发现程序抛出异常了。。。而且还很难找到原因,因为所有的代码逻辑都没变 因为这时A申请的内存是内存池管理的。并不是从操作系统分配的,B函数所在的Y DLL并没有使用内存池,所以B函数在释放A函数申请的内存的时候,还假定它是从操作系统分配的内存。自然就挂了。
赵4老师
2016-01-20
打赏
举报
回复
虎头蛇尾是俗人的习惯, 有始有终是君子的操守。
Saleayas
2016-01-20
打赏
举报
回复
没有任何风险,只要 new 和 delete 引用的 C++ 版本一致就没有问题。 至于,忘记调用 delete 引起的内存泄漏,就和这两个函数没有关系了。 忘记调用是开发者的问题。
Evankaka
版主
2016-01-20
打赏
举报
回复
在另一个函数中delete?所以开发时要仔细。记得哪些是new出来的,哪些是被delete的了。这就是手动内存管理的坏处了,不过。 可以做一些参数是否Null的校验,根据需要抛出异常或重新new
ooolinux
2016-01-20
打赏
举报
回复
程序规模不大的时候,逻辑上保证new的对象用完以后delete且只delete一次,然后考虑6楼版主说的同一个线程内。较大以上的程序不知道有没有好的技术手段来保证(逻辑复杂的时候可能会忘记delete或者重复delete),楼上几位说的或许可行。
gaodlike
2016-01-19
打赏
举报
回复
尽可能别new,尽量在main中定义所需要对象然后引用传进去。 非要new的话,可以建立一个链表来保存new出来的地址和大小,然后不用的时候从链表里面查找释放。 不过这样是不是太做了
paschen
版主
2016-01-19
打赏
举报
回复
关键是你这两个函数是否在同一个线程内,如果是则没什么问题,如果不是就可能出现还没new就去delete了
yshuise
2016-01-19
打赏
举报
回复
引用 3 楼 Mike_God 的回复:
new和delete在两个不同的函数内的动作,怎么用栈
用share_ptr,传递参数形式
D41D8CD98F
2016-01-19
打赏
举报
回复
如果不会忘记 delete ,也不会 delete 超过一次的话,就没风险 然而即使是 C++ 的作者,恐怕也不敢保证不会 忘记 delete 或者 delete 超过一次
Mike_God
2016-01-19
打赏
举报
回复
new和delete在两个不同的函数内的动作,怎么用栈
yshuise
2016-01-19
打赏
举报
回复
所以要用栈,因为栈可以自动释放的
yshuise
2016-01-19
打赏
举报
回复
当然有风险,那就是因为在其他地方抛出异常,而没到delete处,所以造成内存泄露!
C++
的
new
和
delete
详解
本文围绕
C++
的
new
和
delete
展开。介绍了其内部实现,包括内存分配、构造与析构
函数
调用,以及数组
对象
处理差异;阐述了placement技术,可在已有内存构建
对象
、提升性能;讲解了
new
和
delete
运算符重载规则及
风险
;还提及
对象
自动删除技术,能解决部分内存泄漏问题。
C++
学习——
new
delete
关键字
本文详细介绍了
C++
中
new
和
delete
关键字用于动态内存分配和释放的原理,以及它们与malloc和free的区别,包括构造/析构
函数
调用、类型安全性、异常处理和内存释放规则。同时讨论了malloc和
new
的兼容性问题以及在成员
函数
中
使用
delete
的潜在
风险
。,
c++
动态内存管理
new
/
delete
本文深入剖析
C++
中
new
/
delete
操作符的用法、底层原理,以及自定义类型内存管理
中
的构造析构。探讨了为何引入
new
/
delete
,它们与malloc/free的区别,以及如何通过重载operator
new
和operator
delete
实现内存池。最后强调了内存泄漏及其潜在
风险
。
【
C++
】——面试问我
new
和
delete
?后悔没看这篇文章
本文围绕
C++
的内存管理展开,重
点
介绍了
new
和
delete
操作符。对比了C语言的malloc和free
函数
,阐述了
new
和
delete
在使用上的便捷性,尤其是对自定义类型能调用构造和析构
函数
。还分析了其底层原理、与malloc/free的区别,以及内存泄漏的概念和危害。
[
C++
]
new
和
delete
文章介绍了
C++
中
new
和
delete
操作对内存的动态分配与释放,包括构造
函数
在
对象
初始化时的调用,析构
函数
在内存释放时的执行,以及nullptr关键字的使用,强调了正确处理动态内存和避免内存泄漏的重要性。
C++ 语言
65,212
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章