社区
C++ 语言
帖子详情
Linux下free/delete不释放内存
alexapples
2010-10-10 09:32:21
在linux下写了个程序,需要频繁的分配和释放内存,而当真正调用free/delete是,通过top命令查看,程序所占用的内存并没有真正释放。
在windows上程序就不会这样。
具体是什么原因?
...全文
798
11
打赏
收藏
Linux下free/delete不释放内存
在linux下写了个程序,需要频繁的分配和释放内存,而当真正调用free/delete是,通过top命令查看,程序所占用的内存并没有真正释放。 在windows上程序就不会这样。 具体是什么原因?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
manytao
2010-10-11
打赏
举报
回复
[Quote=引用 2 楼 taodm 的回复:]
还有人信top的显示啊。
[/Quote]
lz别信了。。。这是正解。
Blue_may
2010-10-11
打赏
举报
回复
top看到的内存有的时候是假的。需要长时间看看。尤其用stl的时候经常会有这种情况。
Caballeroo
2010-10-11
打赏
举报
回复
5楼讲的不错!
fibbery
2010-10-10
打赏
举报
回复
[Quote=引用 3 楼 alexapples 的回复:]
因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
[/Quote]
那我觉得你的程序在内存管理(不是系统内存管理)上就存在问题,如果要根本解决,我认为你该考虑修改你的程序。
fibbery
2010-10-10
打赏
举报
回复
这个与操作系统对内存的管理有关!只要内存不是疯长就行了,如果是一个Server程序,跑上几天几夜内存使用稳定就没有问题。
dskit
2010-10-10
打赏
举报
回复
[Quote=引用 3 楼 alexapples 的回复:]
引用 1 楼 dskit 的回复:
glibc free/delete 并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
[/Quote]
你再仔细分析分析你的代码,重新审视你的内存分配回收策略吧
看看这篇文章,或许能对你有帮助
http://download.prjcode.com/detail/VcVgcVS
yutaooo
2010-10-10
打赏
举报
回复
通常,比如在x86上跑的linux。堆是从低向高增长的。当glibc的内存分配器发觉内存不足时,会向内核请求扩张数据段。这个数据段是紧接着以前的边界扩展的。新扩展出来的内存纳入到glibc的分配器管理。
当调用free()的时候,用户使用的内存返回给glibc的内存分配器。
当内存分配通过与一个阀值比较,认为它自己管理的空闲内存过多的时,它会收缩。
但是,收缩是要求从 内核已分配给glibc分配器的内存的最大地址,向小地址方向收缩的。
假设,这个时候,有一个堆上对象被分配在了那个最大地址。那么,无法完成收缩,即便是空闲内存非常多,也不能交还给kernel以供其他进程使用。
反之,则可以正常的交还内存给kernel。
应该有一个函数malloc_trim(),可惜我在man malloc_trim时找不到。
对于楼主的问题,一个方案就是考虑mmap()来解决。
具体的可以参考Linux System programming. 第8章。
alexapples
2010-10-10
打赏
举报
回复
[Quote=引用 2 楼 taodm 的回复:]
还有人信top的显示啊。
[/Quote]
那有什么工具可以实时地检测程序内存的使用情况吗?
alexapples
2010-10-10
打赏
举报
回复
[Quote=引用 1 楼 dskit 的回复:]
glibc free/delete 并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
[/Quote]
因为我的程序是一个类似于守护进程的程序,需要一直运行。有时会出现内存被耗尽,但是用valgrind去检测,发现没有内存泄露的情况。弄得一头雾水。有什么好的方法可以解决吗?
taodm
2010-10-10
打赏
举报
回复
还有人信top的显示啊。
dskit
2010-10-10
打赏
举报
回复
glibc free/delete 并不真正将物理内存规划给操作系统
换句话说,glibc会帮助管理内存,
只有在堆的顶部有大于128K的空间才归还内存给操作系统
C++ malloc/
free
/new/
delete
详解(
内存
管理)
这里写目录标题malloc/
free
典型用法
内存
分配实现过程new/
delete
典型用法
内存
分配实现过程new/
delete
和malloc/
free
的区别 malloc/
free
典型用法 malloc()负责动态配置
内存
,大小由size决定,返回值成功时为任意类型指针,失败时为NULL。 void * malloc(size_t size)
free
()负责
释放
动态申请的
内存
空间,调用
free
( )后ptr所指向的
内存
空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果
linux
free
函数头文件,
Linux
_
Linux
下malloc/
free
与new/
delete
的区别,由于malloc/
free
是库函数,不是 - phpStudy...
Linux
下malloc/
free
与new/
delete
的区别由于malloc/
free
是库函数,不是运算符,他们不能执行构造函数和析构函数,只是负责分配
内存
。1、malloc与
free
是C++/C语言的标准库函数,new/
delete
是C++的运算符。它们都可用于申请动态
内存
和
释放
内存
。2、对于非内部数据类型的对象而言,光用maloc/
free
无法满足动态对象的要求。对象在创建的同时要自动执行构...
malloc/
free
和new/
delete
在C语言中,通过malloc申请堆
内存
,
free
释放
堆
内存
。在C++中,也可以通过C语言的方式申请堆
内存
并
释放
堆
内存
,还可以通过new申请堆
内存
delete
释放
堆
内存
。new/
delete
是运算符,在C++中,运算符是可以重载的。如果你需要用自己的一套策略去管理堆
内存
,可以考虑重载new/
delete
的运算符,实现对象池。malloc申请堆
内存
失败返回空指针,new申请堆
内存
失败抛出bad_alloc异常,在实际开发中需要注意下。
linux
无效
内存
访问,在
Linux
下使用用Valgrind查找
内存
泄漏和无效
内存
访问
Valgrind还能发现什么?Valgrind还能发现其它不正确使用
内存
的错误:如果你对同一块
内存
释放
了两次,Valgrind就会探测到,而你则得到非法
free
的调用栈信息。Valgrind 也能检测到使用不正确方法
释放
内存
的错误。比如,在C++语言中有三种基本的
内存
释放
方法:
free
,
delete
和
delete
[]。
free
函数应该仅与malloc函数相对应--在一些系统上,你可能无须面对这个问...
linux
下
delete
释放
不了
内存
,c++
delete
后虚拟
内存
不降的原因(疑似
内存
泄漏)
2017年末,手Q春节红包项目期间,为保障活动期间服务正常稳定,我对性能不佳的Ark Server进行了改造和重写。重编发布一段时间后,结果发现新发布的Svr的机器
内存
一直在上涨。如下图示:
内存
增长趋势图观察后,第一反应是完了,一定存在
内存
泄漏。花了3、4天时间,使用各种办法进行定位,一无所获。后来无意中在SPP日志中发现了端倪,日志中一直打印tcp socket[%d] user check p...
C++ 语言
64,683
社区成员
250,491
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章