C#调用C语言编写的dll,如何释放内存?

peter56688 2009-11-23 03:30:54
我用C#调用了一个C语言编写的dll,在这个dll中分配了很多内存,但是也都是在dll中释放的。因为程序很大,最多时占用了500M多内存,但是最后程序运行完用FreeLibrary释放这个dll后,还是占用这么多内存,一点没有释放,请问这正常吗?还是有什么别的方法,加载的时候是使用的LoadLibrary。

dll单独调试过,没有内存泄露
...全文
421 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsxqaz 2009-11-23
  • 打赏
  • 举报
回复
我估计他调用组建后因为什么地方还有引用所以就没有释放掉,就像我们以前调用office的组建,在进程里都有这个组建的进程,释放以后都还在,要去掉他,几个前提条件

1.必须所有引用都被删除(null掉)
2.调用GC.Collect显示回收(因为.net特性导致了你就算显示调用Collect他也不一定会去回收只有在不够的时候它才会去执行)

我建议你将所有的过程放在一个独立的方法里(不要用任何全局私有变量),然后调用这个方法,再执行外这个方法后在方法外调用GC.Collect()看看有没有用
ztenv 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 peter56688 的回复:]
引用 3 楼 gomoku 的回复:
FreeLibrary并不能释放你在调用该dll时进行分配而没有释放的内存。
解决方法要从明确职责开始,dll的接口要有明确的规定谁负责分配和释放内存。

另:要注意“占用了500M多内存”有多种解读。比如释放内存不一定马上影响Working set的数值。

问题是只要我一关闭exe,任务管理器里显示内存使用量显示那500多马上就被释放了
[/Quote]

内存是和进程相关的,只要你的进程结束了,你的进程所占用的内存(正在使用的或未使用的)都会被系统回收,看看C的dll吧,估计是内部的问题或你自己使用的问题;
wsxqaz 2009-11-23
  • 打赏
  • 举报
回复
确保所有的引用都已经删除(包括private 和 public的)
然后调用GC.Collect()
peter56688 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gomoku 的回复:]
FreeLibrary并不能释放你在调用该dll时进行分配而没有释放的内存。
解决方法要从明确职责开始,dll的接口要有明确的规定谁负责分配和释放内存。

另:要注意“占用了500M多内存”有多种解读。比如释放内存不一定马上影响Working set的数值。
[/Quote]
问题是只要我一关闭exe,任务管理器里显示内存使用量显示那500多马上就被释放了
peter56688 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huing 的回复:]
dll有没有提供free之类的api
[/Quote]
有啊,是这样的,dll中使用的内存都是在dll中malloc分配的,使用完后也都是在dll中free的,并没有dll和exe之间互相使用内存的情况,但是最后卸载dll后所占用的内存都没有释放
gomoku 2009-11-23
  • 打赏
  • 举报
回复
FreeLibrary并不能释放你在调用该dll时进行分配而没有释放的内存。
解决方法要从明确职责开始,dll的接口要有明确的规定谁负责分配和释放内存。

另:要注意“占用了500M多内存”有多种解读。比如释放内存不一定马上影响Working set的数值。
huing 2009-11-23
  • 打赏
  • 举报
回复
dll有没有提供free之类的api
wsxqaz 2009-11-23
  • 打赏
  • 举报
回复
free

111,098

社区成员

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

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

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