社区
C++ 语言
帖子详情
内存申请完,释放后,虚拟内存,PF使用率不降。
tim_cool
2012-08-14 10:56:47
如题,在程序中有多次申请内存的地方,都有做相应的释放。但是释放后,任务管理器中的“虚拟内存大小”并没有减少,在性能中的"PF使用率"也没有降。
最后在某处malloc申请失败。
我申请和释放的操作都在一个线程中进行的。
因为代码的调用关系比较复杂,不能贴出代码。
...全文
464
28
打赏
收藏
内存申请完,释放后,虚拟内存,PF使用率不降。
如题,在程序中有多次申请内存的地方,都有做相应的释放。但是释放后,任务管理器中的“虚拟内存大小”并没有减少,在性能中的"PF使用率"也没有降。 最后在某处malloc申请失败。 我申请和释放的操作都在一个线程中进行的。 因为代码的调用关系比较复杂,不能贴出代码。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Linux
虚拟
内存
参数配置
我们知道系统里的基本单位都是Byte 字节,如果将每一个
虚拟
内存
的 Byte 都对应到物理
内存
的地址,每个条目最少需要 8字节(32位虚拟地址->32位物理地址),在 4G
内存
的情况下,就需要 32GB 的空间来存放对照表,...
KVM
内存
虚拟化
KVM
内存
虚拟化
「抄底 Android
内存
优化 1」——
虚拟
内存
CPU 指令对
内存
的要求 对于 CPU 执行指令来说有三种重要的寄存器: PC 寄存器(Program Counter Register:程序计数器),我们也称作指令地址寄存器(Instruction Address Register)。顾名思义,他就是用来存储下...
深入理解Linux 物理
内存
分配/
释放
过程(1)
在《深入理解Linux物理
内存
管理》《Linux 物理
内存
管理涉及的三大结构体之struct pglist》《Linux 物理
内存
管理涉及的三大结构体之struct zone》《Linux 物理
内存
管理涉及的三大结构体之struct page》中,给大家详细...
云计算----虚拟化概述、CPU虚拟化、
内存
虚拟化、IO虚拟化、aSV虚拟化、aSAN等技术原理
1、虚拟化概述 (1)虚拟化的几个概念 Guest OS:运行在虚拟机之上的操作系统 Guest Machine:虚拟出来的虚拟机 Hypervisor (Virtual Machine Monitor):虚拟化软件层/虚拟机监控器 Host OS:运行在物理机之上的OS ...
C++ 语言
64,641
社区成员
250,579
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章