社区
C++ 语言
帖子详情
C++ 在一个函数中new出一个对象,在某个时间点在另一个函数中delete,会有什么风险吗??
Mike_God
2016-01-19 08:38:37
RT,如果有风险的话,可以有什么更好的方法吗??
...全文
361
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++
中
delete
函数
在
C++
中
delete
函数
用于回收
new
分配的内存空间。
C++
告诉我们在回收用
new
分配的单个
对象
的内存空间的时候用
delete
,回收用
new
[] 分配的一组
对象
的内存空间的时候用
delete
[]。 关于
new
[] 和
delete
[],其
中
又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 在针对简单的基本数据类型,使用
delete
也可...
c++
中
new
对象
,如果不调用
delete
对象
,该
对象
不
会
自动调用析构
函数
;
delete
对象
才
会
自动调用类的析构
函数
(清空
对象
内部在堆区开辟的成员变量),同时可以清空在堆区创建
对象
时开辟的空间
C++
中
new
的用法及显示调用析构
函数
<p>最近被问到了
C++
内存池的问题,其
中
不免涉及到在指定内存地址调用
对象
构造
函数
以及显示调用
对象
析构
函数
的情况。</p>
C++
中
new
的用法
new
是
C++
中
用于动态内存分配的运算符,在C语言
中
一般使用malloc
函数
。 (1)plain
new
顾名思义就是普通的
new
,就是我们惯常使用的
new
。分配内存,调用构造
函数
,在
C++
中
是这样定义的: 1 voi...
C++
在构造
函数
中
使用
new
时的注意事项
一、具体注意事项 (1)如果在构造
函数
中
使用
new
来初始化指针成员,则应在析构
函数
中
使用
delete
。 (2)
new
和
delete
必须相互兼容。
new
对应于
delete
,
new
[]对应于
delete
[]。 (3)如果有多个构造
函数
,则必须以相同的方式使用
new
,要么都带
中
括号,要么都不带。因为只有
一个
析构
函数
,所 有的构造
函数
都必须与它兼容。然而,可以在
一个
析构
函数
中
使用
new
初始化指针,而在另
一个
构造
函数
中
将指针初始化 为空(0或
C++
11
中
的nullptr),这是因为
delete
可以用于空指针(无论是带
C++
:在构造
函数
中
使用
new
时应该注意的事项
C++
:在构造
函数
中
使用
new
时应该注意的事项标签(空格分隔):
c++
如果在构造
函数
中
使用了
new
初始化指针
对象
,那么应该在析构
函数
中
使用
delete
释放
对象
。
new
和
delete
必须相互兼容,
new
对应于
delete
,
new
[]对应于
delete
[]。 如果有多个构造
函数
,则必须以相同的方式使用
new
。然而,可以在
一个
构造
函数
中
使用
new
初始化指针,而在另
一个
构造
函数
中
将其初始化为空(0、N
C++
中
关于
new
和
delete
的使用
总结一下看的一篇文章 为何
new
出
的
对象
数组必须要用
delete
[]删除,而普通数组
delete
和
delete
[]都一样 文章
中
验证了
对象
数组 用
delete
删除不行(因为
对象
数组
中
还有记录
一个
元素大小的4个字节字段,
delete
函数
内操作的内存
中
会
有4个字节的偏移,导致数据混乱) 但没有回答普通数组为什么可以用
delete
删除。 下面是一些总结 1.当
new
一个
有析构
函数
的...
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章