我的问题是-我可以释放在外部模块中创建但没有从LoadLibrary调用中获得的模块句柄之外的句柄的堆内存。
为什么?好吧,我想了解堆内存如何更好地工作,但是让我们举一个真实的例子,我从第三方供应商那里获得了一个DLL,这有点漏洞,而且我没有影响力或时间让他们修复它。
为了演示,请创建一个具有简单导出功能的DLL,该功能可以分配内存负载,但会不小心将其取消分配。假装我对此代码没有控制权。
extern "C" __declspec(dllexport) void otherfunc()
{
// this is in a dll called "OtherProject.dll"
// It sits in the same directory as my exe
int i = 1024 * 1024 * 1024;
char *test = new char[i];
}
在我的代码中,我使用LoadLibrary和GetProcAddress来获取该函数并像这样调用它
#include <windows.h>
typedef void(__stdcall *func)();
int main()
{
HINSTANCE hLibrary = LoadLibrary("otherproject.dll");
func otherfunc = (func)GetProcAddress(hLibrary, "otherfunc");
otherfunc();
FreeLibrary(hLibrary);
// I would like something here (or before FreeLibrary)
// to release the memory created by the leak in otherfunc
return EXIT_SUCCESS;
}
有什么安全的方法可以在释放库时释放所有内存吗?我之所以说是安全的,是因为即使有可能,我也想知道任何陷阱(例如幕后可能发生的优化)。
是的-我知道该过程仍然会退出-但实际的示例隐藏在Windows应用程序的深处。
谢谢。