C#由p/invoke DLL中的operator new分配的空闲内存

Sco*_*ion 3 c# pinvoke

我有一个C#应用程序,它通过p/invoke使用第三方(闭源)本机DLL.

在其中一些调用期间,DLL将使用operator new/operator new []分配内存,并返回一个用于读取结果的指针.

在分配和返回之后,DLL永远不会释放此内存.如何在C#中执行等效的本机操作符delete/operator delete []?

Han*_*ant 6

不可能.DLL在内部存储HeapCreate()返回的句柄.你必须知道释放内存的句柄,你无法从DLL中获取它. 而且您必须知道DLL的malloc函数分配了多少额外字节来调整指针.

如果为DLL编写包装器以便可以调用free(),则甚至无法可靠地执行此操作.DLL必须使用CRT的DLL版本,并且必须使用完全相同版本的编译器和CRT 编译包装器,以便它们共享相同的CRT DLL.

如果你真的很绝望,你可以尝试破解GetProcessHeaps().虽然这很难做到,但容易出错,你真的必须知道你在做什么.返回需要释放指针的DLL 即使在C或C++中也是一种非常糟糕的做法.只是不在.NET中,欢呼垃圾收集器:)