在线等!malloc 和 new 分配内存后的释放问题

bioruan 2009-02-03 03:59:23
满头大汗调试了一天,就是不行!
细节就不多说了,我先用malloc分配内存,free释放,程序运行2分钟后任务管理器(PF占用率)显示内存占用高达2G,而奇怪的是在性能一栏,我的程序的内存占用率一直在400-500M左右徘徊!
于是上网一顿海查,碰到如下解释
///////////////////////////////////////////////////////
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于 malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数 UseNewDelete则简单得多。

所以我认为:由于free操作后,并不是立刻执行析构函数,所以没有立即释放资源,所以内存并没有立即增加。
///////////////////////////////////////////////////////
兴奋,于是动手把用到malloc的地方都改成了new,当然delete也是配了对的,然而,结果和用malloc的情况一样!开动程序后PF内存占用直线上升,一会儿就飙到2G了!然而在性能一栏,我的程序的内存占用仍然只有4、500M!
程序很大,是基因序列分析方面的,我就不贴上来了,我也不算是菜鸟了,所以一般的提问,回答什么的就请您围观一下。据说是分配的动态内存释放后都没有直接还给OS,是这个原因引起的吗?如果是这样,怎么才能还给OS呢?
...全文
385 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bioruan 2009-02-03
  • 打赏
  • 举报
回复
问一下大家,任务管理器中进程菜单下的内存使用和 性能菜单下的PF使用有什么关系
叶落寒山 2009-02-03
  • 打赏
  • 举报
回复
你的程序有内存泄漏,在不停的申请内存,却未释放。还是好好查查程序吧。
debug运行时的提示中有内存泄漏的提示。
bioruan 2009-02-03
  • 打赏
  • 举报
回复
没有调用其他进程
wyc761024 2009-02-03
  • 打赏
  • 举报
回复
windows下一个程序运行空间才4G,你的程序在运行2分钟的时候就已经占用了2G空间,那肯定是内存有泄漏!
建议优化程序结构,内存使用完毕后及时释放,内存池没有使用过,那大概只有在频繁申请和释放的情况下使用才更有效果。
lbh2001 2009-02-03
  • 打赏
  • 举报
回复
free之后有可能没有立即将内存还给OS
建议使用内存池技术
或则直接使用系统提供的内存管理函数来操作,更高效
waizqfor 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bioruan 的回复:]
没有太清楚的概念。只知道PF内存占用满了就离死机不远了,掌柜的不要笑我,我是学遗传出生的,计算机是第二副业
[/Quote]
LZ用软件检查一下 你的程序中 哪个进程占用的内存比较大 怀疑是你内存有泄露
叶落寒山 2009-02-03
  • 打赏
  • 举报
回复
你的程序只占用了400-500M,而系统内存占用高达2G。是不是你的程序调用其他的进程了?在其他的进程中用内存泄漏。
bioruan 2009-02-03
  • 打赏
  • 举报
回复
没有太清楚的概念。只知道PF内存占用满了就离死机不远了,掌柜的不要笑我,我是学遗传出生的,计算机是第二副业
taodm 2009-02-03
  • 打赏
  • 举报
回复
楼主啊,程序的全部内存占用和任务管理器里看到的内存占用率间的关系,你是怎么认为的?
Jonix 2009-02-03
  • 打赏
  • 举报
回复
malloc / free 是不会调用构造和析构的
bioruan 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 waizqfor 的回复:]
引用 2 楼 chenzhp 的回复:
据传闻:“动态内存释放之后,内存没有马上交给OS,应该是由专门管理的内存管理模块来管理。很多释放后的内存被管理链接成一个内存链表【内存池】,操作系统在需要的时候,再从这些池里面获取”

有听过 呵呵
LZ也不要太过追究它 内存释放完 不一定就要马上给操作系统的
[/Quote]
问题是飙到2G就死机了啊!现在我的基因序列才70条,有可能会面对好几百条,该如何处理呢?还有就是才400来M的实际使用量,为什么PF占用却一直增加呢?
waizqfor 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
据传闻:“动态内存释放之后,内存没有马上交给OS,应该是由专门管理的内存管理模块来管理。很多释放后的内存被管理链接成一个内存链表【内存池】,操作系统在需要的时候,再从这些池里面获取”
[/Quote]
有听过 呵呵
LZ也不要太过追究它 内存释放完 不一定就要马上给操作系统的
hai040 2009-02-03
  • 打赏
  • 举报
回复
new[]和delete[]有没配对?
bioruan 2009-02-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
既然内存占用很稳定,你还忙乎什么呢?
[/Quote]
谢谢掌柜的,问题是飙到2G就死机了啊!现在我的基因序列才70条,有可能会面对好几百条,该如何处理呢?还有就是才400来M的实际使用量,为什么PF占用却一直增加呢?
chenzhp 2009-02-03
  • 打赏
  • 举报
回复
据传闻:“动态内存释放之后,内存没有马上交给OS,应该是由专门管理的内存管理模块来管理。很多释放后的内存被管理链接成一个内存链表【内存池】,操作系统在需要的时候,再从这些池里面获取”
taodm 2009-02-03
  • 打赏
  • 举报
回复
既然内存占用很稳定,你还忙乎什么呢?

65,211

社区成员

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

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