程序中频繁使用new/delete有可能会造成内存碎片吗?

laoma_hbu 2012-08-02 06:26:06
现在的碰到的问题是,程序长时间运行后,内存会有较轻微的增长。查找内存泄露无果,怀疑是不是使用new/delete造成了内存碎片,从而看起来程序的内存空间在呈增长的趋势?
...全文
1426 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoma_hbu 2012-08-15
  • 打赏
  • 举报
回复
现在初步调查结果,应该不是内存碎片造成的。应该是Delphi和VC对浮点数异常的处理不同造成的。因为我们的Sdk是用vc++编写的,客户采用了Delphi调用。Delphi偶尔会报我们DLL中Invalid floating point operation错误,而且这个错误会造成异常退出。网上找了个应对策略,在Delphi中调用
const
MCW_EM = DWord($133f);
begin
Set8087CW(MCW_EM);
end
可以屏蔽掉这个问题,目前还在测试中...

公共马甲0315 2012-08-13
  • 打赏
  • 举报
回复
new delete是经过封装了的运算符,相比malloc free virtualalloc之类的运算符都做了优化处理。所以可以放心使用.
gibsonboy 2012-08-13
  • 打赏
  • 举报
回复
to jiangsheng:
chrome报包含恶意内容。
laoma_hbu 2012-08-13
  • 打赏
  • 举报
回复
问题还是没有解决,奇怪的是用C++写的控制台应用程序内存变化很小,跑了一周了也就一点点增加。而用Delphi写的对话框测试程序则增长较明显。
长尾巴的悟空 2012-08-06
  • 打赏
  • 举报
回复
我觉得有用有释放的话,应该问题不是他。
蒋晟 2012-08-06
  • 打赏
  • 举报
回复
用工具看看内存吧
比如http://hashpling.org/asm/
傻X 2012-08-03
  • 打赏
  • 举报
回复
整体服务器性能肯定下降的
赵4老师 2012-08-03
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
傻X 2012-08-03
  • 打赏
  • 举报
回复
程序长时间运行后,多长时间?

碎片有,但是碎片的大小不会计算在你程序使用的内存中的。也就是说你在任务管理器的内存列是看不到的。
hhhh63 2012-08-03
  • 打赏
  • 举报
回复
一般不会有碎片问题,除非new和delete频繁交叉使用。
lang14 2012-08-03
  • 打赏
  • 举报
回复
一般很少用new delete
ok1234567 2012-08-03
  • 打赏
  • 举报
回复
服务器程序,要考量内存碎片的问题
客户端程序,就别太过担心

能够用局部变量(栈)解决的,最好别new,new不仅有碎片问题,更重要的是效率问题
较大块的内存需求和跨线程内存管理,可能需要一个统一的内存管理模块来处理
ouyh12345 2012-08-03
  • 打赏
  • 举报
回复
会有碎片的,找出某些内存不可用
schlafenhamster 2012-08-03
  • 打赏
  • 举报
回复
‘使用new/delete造成了内存碎片’最后是物理内存耗尽。并使用虚拟内存,使运行速度下降。
但那时系统的事,你‘使用’的内存不应增加
laoma_hbu 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
VC 一般程序编译已包含crt, crt其实已经是一个内存池, 个人觉得一般都不用关心内存碎片问题

程序长时间运行后,内存会有较轻微的增长, 并不是一定是泄漏或碎片
比如有一个类使用成员vector, 如果经常push 又没erase, 内存肯定会越来越大
[/Quote]
也有可能,程序中确实使用了vector,不过应该都clear掉了,我再检查检查,谢谢!
laoma_hbu 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
当然会,VC6下频繁new/delete还会报错
[/Quote]
也有可能,程序中确实使用了vector,不过应该都clear掉了,我再检查检查,谢谢!
tankgreat 2012-08-03
  • 打赏
  • 举报
回复
这个主要看你的程序要连续不断的运行多长时间,时间短的话 基本可以不考虑这种问题
96掌门师兄 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
整体服务器性能肯定下降的
[/Quote]

顶。。。
zhouzhipen 2012-08-02
  • 打赏
  • 举报
回复
确实不用太过关心内存碎片问题,那都是一些历史问题,现在的操作系统大多会很好的管理内存。
Yofoo 2012-08-02
  • 打赏
  • 举报
回复
VC 一般程序编译已包含crt, crt其实已经是一个内存池, 个人觉得一般都不用关心内存碎片问题

程序长时间运行后,内存会有较轻微的增长, 并不是一定是泄漏或碎片
比如有一个类使用成员vector, 如果经常push 又没erase, 内存肯定会越来越大
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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