关于占用内存不能释放的问题!

Bmonkey 2005-08-26 10:55:45
偶有一个程序,调用了动态库和机具进行操作,每次操作之后内存都要增加很多,而且窗口关闭之后内存仍然不释放掉,调用gc.collect也没用,请问这中问题该如何解决?
...全文
417 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
速马 2005-08-28
  • 打赏
  • 举报
回复
传入参数都在GC堆上分配内存,所以可以不管
调用结束后,如果还有任何在CRT堆上的数据,则必须手工释放;如果有系统对象,比如说一个GDI句柄,也必须调用相关的方法释放资源
wxwx110 2005-08-28
  • 打赏
  • 举报
回复
吸构函数还是要学的不能完全依靠.NET的垃圾回收,那东西什么时候释放内存真的没准,所以当使用完对象后最好都要切断它和托管堆的连接,同时调用相应的方法来释放掉就象C++中的代码一样
Bmonkey 2005-08-28
  • 打赏
  • 举报
回复
问题大概解决了,不是这块的问题,但是就绪问问
我对于堆上传入参数用了Marshal.FreeCoTaskMem来释放了的.但是偶还是不清楚,在p/invoke下,是否全部参数都不需要手动释放呢?我看msdn上有个释放非托管类型的资源的例子,它就对IntPtr类型进行了释放,而且又是通过p/invoke调用的kenerl32.dll的一个close....的方法进行的,偶有点迷惑了,请讲解讲解.^_^
Bmonkey 2005-08-28
  • 打赏
  • 举报
回复
自己再好好理解一下,结贴了.
Bmonkey 2005-08-28
  • 打赏
  • 举报
回复
版主的意思就是,简单数据类型都是可以不需要去管理的?
IntPtr是系统对象?
TechEye 2005-08-26
  • 打赏
  • 举报
回复
没有办法,用GC.Collect都不是最好办法
tangyong12 2005-08-26
  • 打赏
  • 举报
回复
调用用dispose方法试试
andywang110001 2005-08-26
  • 打赏
  • 举报
回复
GC.Collect();GC.WaitForPendingFinalizers();不过有一点性能损失
速马 2005-08-26
  • 打赏
  • 举报
回复
>>> 在最小化的时候,程序占用的内存下去了,(应该是此时执行垃圾收集了吧?)
No, 此时只是物理内存中的一部分数据被交换到虚拟内存(页面文件)中而已,并不触发垃圾收集条件

非托管资源不受GC管理,要自己进行释放操作。实现Dispose模式只是一种标准的做法
Bmonkey 2005-08-26
  • 打赏
  • 举报
回复
偶有一个类,没次操作都要调用两个动态库不止一次,动态库应该算非托管资源了吧,那么我是否应该自己实现该类的dispose呢?
Bmonkey 2005-08-26
  • 打赏
  • 举报
回复
在最小化的时候,程序占用的内存下去了,(应该是此时执行垃圾收集了吧?)但是如果一直最大话的话那内存占用一直位置着,我gc.collect也不行,请问该如何解决这个问题??

快给点意见啊,偶分多,解决了再发分
暗石绿 2005-08-26
  • 打赏
  • 举报
回复
垃圾回收机制会自动处理无用资源。
但是它不会马上释放。

如果可以的话,最好还是用程序主动释放无用资源。
redcomet2004 2005-08-26
  • 打赏
  • 举报
回复
托管的没什么办法控制,只要别忘了Dispos就行
lyb_abiandbel 2005-08-26
  • 打赏
  • 举报
回复
不用过多考虑内存释放的问题,除非你的程序使用了很多非托管的资源,那就要用Dispos(),

否则不要过多使用,会影响程序性能,

垃圾回收机制会自动处理无用的托管资源释放的问题,

.net是自动的,不需要考虑太多。
速马 2005-08-26
  • 打赏
  • 举报
回复
传入参数都不需要手工释放,传出参数数据如果是在堆上分配的,则需要用Marshal.FreeCoTaskMem手工释放
Bmonkey 2005-08-26
  • 打赏
  • 举报
回复
我在msdn里面看了看释放非托管的例子,它对于IntPtr类型的有一个释放,认为是非托管资源。那么请问,如下:

[DllImport(conEncrypt, SetLastError=true, CharSet=CharSet.Ansi), SuppressUnmanagedCodeSecurity]
internal static extern int EncryptOfDES_HD(byte[] Key, byte[] Source, int Blocks);

[DllImport(conConversion, SetLastError=true), SuppressUnmanagedCodeSecurity]
internal static extern int Conversion(ref int Command, IntPtr buffer, int nSizeOfParameter);

如果象如上的两个非托管方法,调用的话,那么传入上面两个方法的参数Key,Command,一个是byte[]类型的一个是int型的,它们也被认为是非托管资源吗?如果是, 那么该如何释放啊?

110,555

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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