清除非托管代码中的内存泄漏
本文关键字:内存 泄漏 非托管代码 清除 | 更新日期: 2023-09-27 18:12:23
我一直在寻找第三个沙箱内存泄漏的最佳方法在。net框架中使用party库。
我有一个用c++/cli编写的第三方库,它泄漏了大量内存。
有没有人发现了一种优雅的清理方式使用。net的非托管内存泄漏?
问好,
不可能,除非你可以修改和修复c++代码,但这可能不是一个选择。我过去也遇到过同样的问题,解决方案是在进程中托管泄漏代码(注意:应用程序域不够)并定期关闭该进程。使用一些IPC技术与该流程实例进行通信。即使在需要关闭一个进程时,也可以选择创建一个由两个进程组成的池,这样就可以轻松地切换到已经运行的另一个实例。
您可以运行您选择的内存检查器来查找泄漏。这是一个非常直接的过程。我使用Intel Inspector (Intel parallel studio的一部分),但其他人也可以。
为了沙盒分配,您可以使用malloc
替代,如google_malloc,并修改它以具有free_all_memory
函数,如果它已经没有一个。
这不是很优雅,但是如果你的非托管代码非常糟糕,这是一个选择。
非托管对象:非托管对象是在。net库的控制之外创建的,并且不受CLR管理。这种非托管代码的例子有COM对象、文件流、连接对象、互操作对象。(基本上,在。net代码中引用的第三方库。)GC不能自己处理非托管对象,因为它对它一无所知。例如,假设您在c++/CLI库类中使用了一个指针,并且在该类的析构函数(~)中删除了该指针。这将导致内存泄漏,因为在c++/CLI中,符号~已经为确定性析构函数保留了(因为在c++中所有析构函数都是确定性的)。所以,这里我们必须使用符号!相反。
c++/CLI中IDisposable, Finalizer和GC.SuppressFinalize()的示例
ref class ClassName {
public:
ClassName() : m_isDisposed(false) {
m_unmanagedData = new CustomObject();
}
~ClassName() {
if (m_isDisposed)
return;
this->!ClassName();
m_isDisposed = true;
}
// Finalizer
!ClassName() {
delete m_unmanagedData;
}
private:
bool m_isDisposed;
CustomObject * m_unmanagedData;
};
遵循Microsoft的文档指南来查找c++/CLI库中的内存泄漏使用CRT库查找内存泄漏