又是一个棘手的问题:内存泄漏,请高手回答!

我用PHAB编了一个分析数据绘制曲线的程序,现在出现一个奇怪的问题,当程序启动后从系统监视窗口看到内存占用了13%,当我打开这个分析程序后,内存占用到30%左右(这是我动态分配了内存),当我关闭了这个分析窗口后我的程序释放了分配的内存,按理说应该回到13%,可是从系统监视窗口看到内存占用了15%,开始我分析可能是内存没有释放干净,可是奇怪的是之后不论我操作多少次打开分析窗口(分配内存)和关闭分析窗口(释放内存),内存占用率总是15%,但是如果我kill掉这个程序再重新启动,内存的占用率依然保持上次的值,这样就会导致再不重开机的情况下,内存一点一点的被吃光,这可能是什么原因造成的呢?我用的开动态内存和释放内存的方法是C++的new和delete.

前面都还正常,什么叫“kill掉这个程序再重新启动,内存的占用率依然保持上次的值”?

你的意思是说,启动程序后,pidin info报告还有比如60MB的Free Mem,但把程序kill重起的话,FreeMem就减少了?可以用pidin mem看看有没有谁的内存持续增加的?

是这样的,我这个系统启动后占用的内存为13%,系统如果重启(就是kill掉它们然后重启),系统占用的内存应该也是13%,可是一旦运行了这个数据分析程序内存就会占到15%,如果kill掉这个程序再重启它占用的内存就不是开机时的13%而是15%,如果再运行这个数据分析程序内存就会占到17%,就是每次内存都要被吃掉2%,但kill掉这个程序时这部分内存无法释放。

唐先生,我用pidin mem监视这个程序,发现进行某些操作时data下的字节有时会增加,可是我查了一下相关的代码,这些代码里面也没有new或malloc等开辟内存的语句呀!只是定义了一个指针变量然后使用了,代码如下,
uint16_t*scroll;
PtGetResource(ABW_PtScrollbar_trans_updown,Pt_ARG_SCROLL_POSITION,&scroll,0);
这会导致内存泄漏吗?

如果你的程序一直在运行,内存的减少是正常的,free()不能保证内存会被退还给系统。

如果你的程序被kill消失后(用pidin确认),内存仍然不能还给系统,那就要检查别的
程序有没有(因为你的操作)而泄漏内存。或者你的程序用了共享内存没有清除什么的。

“如果你的程序一直在运行,内存的减少是正常的,free()不能保证内存会被退还给系统”,为什么会不断减少呢?这不是会导致最后系统崩溃吗?唐先生,有没有解决的方法呢?郁闷呀。。。

因为内存会被分成很多小块而无法使用(Fragmentation)。即使没有内存了,也不应该导致系统崩溃,最多进程无法取得内存而出错。

解决的办法当然有,但这同你的情形不一样啊。你说把进程杀了也不能收回内存,你肯定这一点吗?

从系统监视窗口看是不能回收