内存申请完,释放后,虚拟内存,PF使用率不降。

tim_cool 2012-08-14 10:56:47
如题,在程序中有多次申请内存的地方,都有做相应的释放。但是释放后,任务管理器中的“虚拟内存大小”并没有减少,在性能中的"PF使用率"也没有降。
最后在某处malloc申请失败。
我申请和释放的操作都在一个线程中进行的。
因为代码的调用关系比较复杂,不能贴出代码。
...全文
464 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
Simeone_xu 2012-08-19
  • 打赏
  • 举报
回复
释放的内存被其他的变量所用
titer1 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

如果vld 和ibm purify 都认为没有内存泄露,那就是没有内存泄露。
别相信windows的任务管理器。
[/Quote]
++
nevermorewish 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

释放内存后,不一定会把内存马上还给系统。
[/Quote]

++
nightkids_008 2012-08-15
  • 打赏
  • 举报
回复
不能跟踪到malloc内部的调用看看么,brk,sbrk,或者mmap那一级的调用。
晨星 2012-08-15
  • 打赏
  • 举报
回复
缓冲区溢出也有可能导致malloc失败,不一定就是分配-释放方面的问题。检查的范围可能需要扩大。
tim_cool 2012-08-15
  • 打赏
  • 举报
回复
qq874774259说的很好。
我们的程序是对图片就行处理,也确实通过库去申请内存生成图片,但是我们也是通过库的函数去释放内存。
并没有外部释放。
taodm 2012-08-15
  • 打赏
  • 举报
回复
如果vld 和ibm purify 都认为没有内存泄露,那就是没有内存泄露。
别相信windows的任务管理器。
tianxiadys 2012-08-15
  • 打赏
  • 举报
回复
malloc分配内存顺序是这样的:
在c运行库内部保有的内存池中寻找一块足够的内存
(如果失败)调用VirtualAlloc分配内存
再次在c运行库内部保有的内存池中寻找一块足够的内存


free:
将用户释放的内存划入c运行库内部保有的内存池
如果内部保有的内存池空间过大,则调用VirtualFree释放内存


所以free函数释放的内存不会马上还给系统

有些dll使用了静态链接的c运行库,这些dll分配的内存在外部释放会出现错误,因为每个c运行库都有一个内部保有的内存池。

但是很多dll都使用了静态链接的c运行库,导致几乎每个进程内部都存在数个c运行库,所以,释放内存必须使用这些dll所提供的释放内存函数
ri_aje 2012-08-15
  • 打赏
  • 举报
回复
malloc 失败,每次是固定的位置,还是随机的呢?
titer1 2012-08-15
  • 打赏
  • 举报
回复
malloc是你自己调用的,
如果是, 换换new

你可以尝试所有的内存一次性申请,。。。最后一个delete(free)搞定,只不过原来的若干New要合并
tim_cool 2012-08-15
  • 打赏
  • 举报
回复
小牛同学!
1.vld 和ibm purify 都试过 都没有定位到所谓的问题点。
2.你说申请和delete打印地址吗? 虽然我没有打印地址,但是我是一步一步跟的 地址是一致的。
如果申请和释放的地址不一直,那个很容易出问题的。
3.其实我这个所谓的崩溃,是malloc失败 返回null,原代码给的个提示,也算是崩溃吧。
titer1 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

程序在没退出的时候崩溃,不涉及析构的问题。
[/Quote]

你崩溃时的 堆栈 有提示,我想
titer1 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 4 楼 的回复:
还有注意malloc和free配对,new/new[]和delete/delete[]配对

呵呵,虽然是改别人的工程,但已尽量把原先的配对。至于说的用内存检测工具。我已经使用多个工具至今我效果。
[/Quote]

普通一点的方法,
每次申请地址时打印出来,
delete前,也打印。这样对比着看
titer1 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
如题,在程序中有多次申请内存的地方,都有做相应的释放。但是释放后,任务管理器中的“虚拟内存大小”并没有减少,在性能中的"PF使用率"也没有降。
最后在某处malloc申请失败。
我申请和释放的操作都在一个线程中进行的。
因为代码的调用关系比较复杂,不能贴出代码。
[/Quote]

从任务管理器看内存泄露,不太准确。
可以借助工具看
vld
ibm purify
tim_cool 2012-08-15
  • 打赏
  • 举报
回复
希望更多的人参与进来,毕竟这个问题我在搜索引擎上搜了好几天了,各种换关键字。
如果这个问题解决了,我想个光是帮助了我,也是帮助了有类似问题的朋友。
tim_cool 2012-08-14
  • 打赏
  • 举报
回复
程序在没退出的时候崩溃,不涉及析构的问题。
翅膀又硬了 2012-08-14
  • 打赏
  • 举报
回复
看看他的析构函数有什么问题吗
tim_cool 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
还有注意malloc和free配对,new/new[]和delete/delete[]配对
[/Quote]
呵呵,虽然是改别人的工程,但已尽量把原先的配对。至于说的用内存检测工具。我已经使用多个工具至今我效果。
tim_cool 2012-08-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
释放内存后,不一定会把内存马上还给系统。
[/Quote]
在发帖之前,查了很多相关资料。我的这个问题是申请释放,任务管理器中的“内存使用”会有相应的增减,而“虚拟内存的大小”是有增无减。PF的使用率也是内存申请了就增加,但是内存释放了 无变化。
翅膀又硬了 2012-08-14
  • 打赏
  • 举报
回复
晕,我回复的怎么没了。free之后,内存不一定还给系统,下次再malloc的时候,还会申请到原来释放的内存,这样是为了提高效率。。我不明白我的回复为什么被管理员删除。又没说脏话,又没有mark
加载更多回复(8)

64,641

社区成员

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

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