我一直在寻找第三种沙盒内存泄漏的最佳方法 派对库从.Net框架中使用它们。
我有一个第三方库,用C ++ / cli编写,泄漏了大量内存。
是否有人找到了一种优雅的清洁方式 使用.Net的非托管内存泄漏?
致以最诚挚的问候,
答案 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