释放在另一个DLL

时间:2019-05-11 17:48:58

标签: c++

我的问题是-我可以释放在外部模块中创建但没有从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应用程序的深处。

谢谢。

0 个答案:

没有答案