C++ 在一个函数中new出一个对象,在某个时间点在另一个函数中delete,会有什么风险吗??

Mike_God 2016-01-19 08:38:37
RT,如果有风险的话,可以有什么更好的方法吗??
...全文
361 13 打赏 收藏 转发到动态 举报
写回复
用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处,所以造成内存泄露!

64,639

社区成员

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

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