清除非托管代码中的内存泄漏

本文关键字:内存 泄漏 非托管代码 清除 | 更新日期: 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库查找内存泄漏