我有一个调用本机库的托管 dll。这个本机库通常返回 IntPtrs。这些可以传递给本机库中的其他方法来执行操作,或者告诉库释放与 IntPtr 关联的实例。但只有一些实例需要以这种方式释放,其他实例由库管理。问题是文档并不总是清楚地说明哪些实例必须被释放,哪些不能。
我想知道的是,是否有一种方法可以判断我的代码是否保留了对任何必须释放的指针的引用,从而导致内存泄漏?
我有一个调用本机库的托管 dll。这个本机库通常返回 IntPtrs。这些可以传递给本机库中的其他方法来执行操作,或者告诉库释放与 IntPtr 关联的实例。但只有一些实例需要以这种方式释放,其他实例由库管理。问题是文档并不总是清楚地说明哪些实例必须被释放,哪些不能。
我想知道的是,是否有一种方法可以判断我的代码是否保留了对任何必须释放的指针的引用,从而导致内存泄漏?
最简单的方法可能是使用内存分析器。一个快速的谷歌找到了一个指向MemProfiler的链接。我已经使用过一次(作为试用版),并且能够找到我没有正确处理 DirectoryEntries 的地方。我敢肯定还有其他的,包括RedGate的这个。
您可能希望考虑使用SafeHandles来包装从本机代码返回的句柄。它为 IntPtr 提供了一些附加值。