程序运行时,内存占用会越来越多,可是程序退出后,并没有发现内存泄漏,

时间:2022-12-25 08:04:38
不知道有什么好的调试工具知道是哪个动态库新分配了内存?因为我的程序中使用的动态库较多,大概有10几个,现在不知道是什么原因造成的,查看代码也没有发现没有释放内存的地方,请大家分析一下原因,给出定位问题的办法,谢谢!

11 个解决方案

#1


内存占用会越来越多?跑个较长的时间试试呢,比如一天?

#2


跑久了,占用系统内存越来越多,最后系统就崩了。

#3


我用BoundsCheck调试了一下,发现新占用的内存都是MSI.dll,CSCUI.dll占用的,可是我的程序中并没有调用这两个库,如何释放它们占用的内存呢?

#4


既然使用了BoundsCheck,那你可以知道内存泄漏的代码调用堆栈啊,这样就能够找到你的代码分配内存的地方的

#5


我调试时,通过BoundsChecker查看使用内存情况,一边用任务管理器看,调试时发现,使用任务管理器查看应用使用的内存变大了,可是BoundsChecker没有发现新的内存使用,不知道为什么?

#6


程序退出后,当然不会有内存泄漏了,系统能够保证进程退出,回收所有的资源!
   不要过多怀疑dll有泄漏(如果不是你自己做的dll话!),多看看自己的代码,比如专门找malloc和new关键字,大概问题都出在自己的不小心上!

#7


楼上说的对!

#8


除了使用的openssl的库外,其他的dll都是自己写的。我仔细检查过所有分配内存的地方,确定都释放了,也就是有new的地方肯定有相应的delete,有malloc的地方有free,但是还是遇到这个问题。另外程序中用了ADO访问Access数据库,我是使用一个Connection,后面要访问数据时用_RecordsetPtr ,先open后close,再release了,应该也没有问题啊。

#9


不过数据库访问,是会内存占用越来越多的,好像ado自己会维护一个内存池,我们根本无法回收那些资源,就是说,如果你不断的添加记录,就会不断的增加内存占有,除非你完全释放ado连接,再重新连接ado!
   即使new之后都有delete,还是可能存在泄漏啊,有时候看是不是用错了return语句,比如没释放就返回,或者发生了意外,强制退出函数了,注意用try{}catch{}捕捉!

#10


MSI.dll,CSCUI.dll用工具看里面的导出函数啊.
然后看DLL的相互调用层次,就知道是什么时间调用的了.

有可能是你调用的DLL再去调用的.

#11


也有可能你是用了CArray来存贮大量的数据。是的话,可能出出现大连内存耗用的情况

CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。

不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。

在仔细看看吧

#1


内存占用会越来越多?跑个较长的时间试试呢,比如一天?

#2


跑久了,占用系统内存越来越多,最后系统就崩了。

#3


我用BoundsCheck调试了一下,发现新占用的内存都是MSI.dll,CSCUI.dll占用的,可是我的程序中并没有调用这两个库,如何释放它们占用的内存呢?

#4


既然使用了BoundsCheck,那你可以知道内存泄漏的代码调用堆栈啊,这样就能够找到你的代码分配内存的地方的

#5


我调试时,通过BoundsChecker查看使用内存情况,一边用任务管理器看,调试时发现,使用任务管理器查看应用使用的内存变大了,可是BoundsChecker没有发现新的内存使用,不知道为什么?

#6


程序退出后,当然不会有内存泄漏了,系统能够保证进程退出,回收所有的资源!
   不要过多怀疑dll有泄漏(如果不是你自己做的dll话!),多看看自己的代码,比如专门找malloc和new关键字,大概问题都出在自己的不小心上!

#7


楼上说的对!

#8


除了使用的openssl的库外,其他的dll都是自己写的。我仔细检查过所有分配内存的地方,确定都释放了,也就是有new的地方肯定有相应的delete,有malloc的地方有free,但是还是遇到这个问题。另外程序中用了ADO访问Access数据库,我是使用一个Connection,后面要访问数据时用_RecordsetPtr ,先open后close,再release了,应该也没有问题啊。

#9


不过数据库访问,是会内存占用越来越多的,好像ado自己会维护一个内存池,我们根本无法回收那些资源,就是说,如果你不断的添加记录,就会不断的增加内存占有,除非你完全释放ado连接,再重新连接ado!
   即使new之后都有delete,还是可能存在泄漏啊,有时候看是不是用错了return语句,比如没释放就返回,或者发生了意外,强制退出函数了,注意用try{}catch{}捕捉!

#10


MSI.dll,CSCUI.dll用工具看里面的导出函数啊.
然后看DLL的相互调用层次,就知道是什么时间调用的了.

有可能是你调用的DLL再去调用的.

#11


也有可能你是用了CArray来存贮大量的数据。是的话,可能出出现大连内存耗用的情况

CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。

不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。

在仔细看看吧