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

时间:2014-07-10 12:18:50

标签: c# memory-leaks c++-cli

我一直在寻找第三种沙盒内存泄漏的最佳方法 派对库从.Net框架中使用它们。

我有一个第三方库,用C ++ / cli编写,泄漏了大量内存。

是否有人找到了一种优雅的清洁方式 使用.Net的非托管内存泄漏?

致以最诚挚的问候,

3 个答案:

答案 0 :(得分:2)

没办法,除非您当然可以修改和修复C ++代码,但可能这不是一个选项。我在过去遇到了同样的问题,解决方案是在流程中托管泄漏的代码(注意:应用程序域足够)并定期关闭该进程。使用一些IPC技术来与该流程实例进行通信。即使您需要关闭进程,也可以选择创建一个包含两个进程的池来进行反应,这样您就可以轻松切换到已经运行的另一个实例。

答案 1 :(得分:0)

您可以运行您选择的内存检查程序来查找泄漏。这是一个非常直接的过程。我使用英特尔Inspector(英特尔并行工作室的一部分),但其他人也会这样做。

为了进行沙箱分配,您可以使用malloc替换,例如google_malloc,并修改它以具有free_all_memory功能(如果它还没有)。

这不是很优雅,但如果您的非托管代码形状非常糟糕,那么这是一个选项。

答案 2 :(得分:0)

非托管对象: 非托管对象是在 .NET 库控制之外创建的,不受 CLR 管理。此类非托管代码的示例是 COM 对象、文件流、连接对象、互操作对象。 (基本上,.NET 代码中引用的第三方库。)。 GC 不能自己处理非托管对象,因为它不知道它。因此,例如,假设您在 C++/CLI 库类中使用了一个指针,然后在该类的析构函数 (~) 中删除了该指针。这将导致内存泄漏 because, In C++/CLI, the notation ~ is already reserved for deterministic destructors (because all destructors are deterministic in C++). So, here we must use the notation ! instead

IDisposable、Finalizer 和 GC.SuppressFinalize() 的 C++/CLI 示例

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 库中的内存泄漏 Find memory leaks with the CRT library