混合模式C++/CLR应用程序中的内存泄漏

Joh*_*ohn 9 .net c++ mixed-mode memory-leaks

我在混合模式C++/CLR .NET应用程序中遇到内存泄漏问题.

(它是使用"/ clr"编译器设置链接到VS2008 C++/CLR Windows窗体应用程序的C++本机静态库)

典型行为:应用程序开始使用30 MB(私有内存).然后泄漏内存减慢,比如在模拟重负载下运行时每小时一MB.这模拟了数天或数周的应用程序.

我尝试使用几种工具来跟踪内存泄漏,包括Visual Studio CRT库附带的CRT调试内容.我还使用了商业泄漏检测工具("Memory Validator").

两者都报告在关机时可忽略不计的内存泄漏(一些小的条目,相当于我不担心的几KB).此外,我可以看到,在运行时,跟踪的内存似乎没有那么多(所以我不相信它只是被占用的内存,只在app退出时释放).我得到大约5 MB的列出内存(总计> 30MB).

设置工具(Memory Validator)以跟踪所有内存使用情况(包括malloc,new,虚拟内存分配和一大堆其他类型的内存分配).基本上,已选择要跟踪的内存的每个设置.

.NET镜像报告它使用大约1.5 MB的内存(来自perfmon).

这是最后一点信息:我们有一个版本的应用程序作为本机控制台应用程序运行(纯粹是原生的 - 根本不是CLR).这与混合模式的95%相同,除了没有UI的东西.这根本不会泄漏内存,并且在大约5MB的私有字节处达到峰值.

所以基本上我试图在这里得到的是,我认为任何本机代码都不会泄漏内存.

另一个难题:我发现这是指在2.0框架(我是)时混合模式应用程序中的内存泄漏:http://support.microsoft.com/kb/961870

不幸的是,细节非常稀疏,所以我不确定它是否相关.我确实尝试针对3.5框架而不是2.0但仍然有同样的问题(也许我没有做到这一点).

有人有什么建议吗?

一些可能对我有帮助的事情:

  • 是否还有其他类型的内存分配,我没有跟踪?
  • 为什么数字不加起来?我得到5 MB的CRT内存使用量,1.5 MB的.NET内存,那么为什么整个应用程序使用30MB的私有字节呢?这一切都绑在.NET框架中吗?为什么我在泄漏工具中看不到这些?.NET框架不会显示为某种分配的内存吗?
  • 任何其他泄漏检测工具适用于混合模式应用程序?

谢谢你的帮助

约翰

Joh*_*ohn 6

好的,我终于找到了问题.

这是由/ EH(异常处理)的错误设置引起的.

基本上,对于混合模式.NET应用程序,您需要确保使用/ EHa而不是默认/ EH编译所有静态链接的库.

(应用程序本身也必须使用/ EHa编译,但这是给定的 - 如果您不使用它,编译器将报告错误.问题是当您链接到其他静态本机库时.)

问题是,在使用/ EH编译的本机库中抛出的应用程序托管位中捕获的异常最终无法正确处理异常.然后,不会正确调用C++对象的析构函数.

在我的情况下,这只发生在一个罕见的地方,因此为什么我花了很长时间才发现.