11 个解决方案
#1
内存占用会越来越多?跑个较长的时间试试呢,比如一天?
#2
跑久了,占用系统内存越来越多,最后系统就崩了。
#3
我用BoundsCheck调试了一下,发现新占用的内存都是MSI.dll,CSCUI.dll占用的,可是我的程序中并没有调用这两个库,如何释放它们占用的内存呢?
#4
既然使用了BoundsCheck,那你可以知道内存泄漏的代码调用堆栈啊,这样就能够找到你的代码分配内存的地方的
#5
我调试时,通过BoundsChecker查看使用内存情况,一边用任务管理器看,调试时发现,使用任务管理器查看应用使用的内存变大了,可是BoundsChecker没有发现新的内存使用,不知道为什么?
#6
程序退出后,当然不会有内存泄漏了,系统能够保证进程退出,回收所有的资源!
不要过多怀疑dll有泄漏(如果不是你自己做的dll话!),多看看自己的代码,比如专门找malloc和new关键字,大概问题都出在自己的不小心上!
不要过多怀疑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{}捕捉!
即使new之后都有delete,还是可能存在泄漏啊,有时候看是不是用错了return语句,比如没释放就返回,或者发生了意外,强制退出函数了,注意用try{}catch{}捕捉!
#10
MSI.dll,CSCUI.dll用工具看里面的导出函数啊.
然后看DLL的相互调用层次,就知道是什么时间调用的了.
有可能是你调用的DLL再去调用的.
然后看DLL的相互调用层次,就知道是什么时间调用的了.
有可能是你调用的DLL再去调用的.
#11
也有可能你是用了CArray来存贮大量的数据。是的话,可能出出现大连内存耗用的情况
CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。
不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。
在仔细看看吧
CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。
不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。
在仔细看看吧
#1
内存占用会越来越多?跑个较长的时间试试呢,比如一天?
#2
跑久了,占用系统内存越来越多,最后系统就崩了。
#3
我用BoundsCheck调试了一下,发现新占用的内存都是MSI.dll,CSCUI.dll占用的,可是我的程序中并没有调用这两个库,如何释放它们占用的内存呢?
#4
既然使用了BoundsCheck,那你可以知道内存泄漏的代码调用堆栈啊,这样就能够找到你的代码分配内存的地方的
#5
我调试时,通过BoundsChecker查看使用内存情况,一边用任务管理器看,调试时发现,使用任务管理器查看应用使用的内存变大了,可是BoundsChecker没有发现新的内存使用,不知道为什么?
#6
程序退出后,当然不会有内存泄漏了,系统能够保证进程退出,回收所有的资源!
不要过多怀疑dll有泄漏(如果不是你自己做的dll话!),多看看自己的代码,比如专门找malloc和new关键字,大概问题都出在自己的不小心上!
不要过多怀疑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{}捕捉!
即使new之后都有delete,还是可能存在泄漏啊,有时候看是不是用错了return语句,比如没释放就返回,或者发生了意外,强制退出函数了,注意用try{}catch{}捕捉!
#10
MSI.dll,CSCUI.dll用工具看里面的导出函数啊.
然后看DLL的相互调用层次,就知道是什么时间调用的了.
有可能是你调用的DLL再去调用的.
然后看DLL的相互调用层次,就知道是什么时间调用的了.
有可能是你调用的DLL再去调用的.
#11
也有可能你是用了CArray来存贮大量的数据。是的话,可能出出现大连内存耗用的情况
CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。
不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。
在仔细看看吧
CArray内存的分配是动态的,刚开始的时候比较小,如果数据多了,他就会继续分配内存,如果没有如果的空间去分配该数据的话。他将时候内存copy,在另一个所谓足够的空间中从新分配,以此类推 无用的空间由system来释放。
不过,我想如果是这样的话,也不该出现死机的现象。windows的管理还是很可靠的呀。
在仔细看看吧