C#内存泄漏 非托管堆内存泄漏

本文讲述了在C#中遇到的一个由于非托管堆内存泄漏导致的程序崩溃问题。作者通过调用第三方COM组件时遇到崩溃,发现是由于与非托管代码交互时的内存管理不当。通过阅读MSDN上的文章,了解到动态方法(DynamicMethod)可以用来解决这个问题。通过将原本的委托调用方式改为使用DynamicMethod创建并调用方法,成功解决了内存泄漏和程序崩溃的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚进实验室,老师给我一项任务:一个已经开发好的软件,有两个BUG,要我去改。软件是用C#写的,这个以前没搞过C#。所以就一边看书学习一边看代码。

第一个BUG其实严格来说不叫BUG,而是功能的完善:目前软件的日志只能在本软件中保存和打开查看,我需要把日志以Word文档形式导出来。这个功能的实现我用了大概一周就基本完成了。后来就把精力全放在第二个BUG上了。第二个BUG是:本软件要调用外部COM组件,但是在执行某些COM组件时,程序运行到一半就自行退出,崩溃了。听说以前有多个同学搞过这个问题,都没有结果。但是我还是从师兄那学了不少经验,测试的基本方法就是他教我的,这省了我不少时间。开始时只是跟踪到在执行COM组件中的某方法时程序突然退出(崩溃了)。师兄也说是内存溢出,但没有找到解决方法。

我从接触这个软件到现在已经20多天了。一边对软件功能及实现进行熟悉,一边学习C#语言。前几天还一直在调试程序时查看内存、寄存器什么的,可是也没查看出什么眉目。今天在网上搜索了“调试内存泄漏”,结果找到一篇好文章:http://msdn.microsoft.com/zh-cn/magazine/cc163491.aspx 。看到一半我就觉得有戏。试着改了一下代码,其实只改了两行代码而已,问题就解决了,心情很是愉悦!

其实这个软件的问题就是,非托管堆内存泄漏。与非托管代码进行互操作:这是内存泄漏的起因之一,涉及到与非托管代码的互操作,例如在 COM Interop 中通过 P/Invoke 和 COM 对象使用 C 样式的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值