我在我的函数中使用GetModuleHandle。每次进行操作时都会调用该函数。我想知道是否一次又一次地调用该函数,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何问题)。我实际上知道什么时候被调用以及什么时候被击中。但我无法弄清楚GetModuleHandle是否导致任何句柄泄漏。任何人都可以帮我解答。谢谢,以下是在操作中重复调用的函数。
void Myfunc(int iCtrlID) { HINSTANCE hinst = GetModuleHandle(“r.dll”);
s.LoadString(hinst,iCtrlID); // 这里有更多代码 // }
答案 0 :(得分:5)
GetModuleHandle函数返回一个 处理映射模块而不用 递增其引用计数。 因此,在通过时要小心 处理FreeLibrary函数, 因为这样做会导致DLL 模块过早地取消映射。
读取:如果您尝试释放句柄,则会崩溃。 不要清理,你没事。
答案 1 :(得分:3)
您可以随意调用GetModuleHandle()。我的回忆是,如果检查该值,通常它是每次在您的进程中返回的相同句柄(在不同的进程中可能会有所不同)。这不会导致任何内存泄漏。
如果您关心内存,可以在句柄上调用FreeLibrary()来卸载dll,但实际上这通常很棘手,大多数进程只会等待进程退出以卸载动态加载的模块。 / p>
好的,我刚用以下代码测试了它:
HANDLE h1 = GetModuleHandle(L"user32.dll");
HANDLE h2 = GetModuleHandle(L"user32.dll");
HANDLE h3 = GetModuleHandle(L"user32.dll");
每个句柄都是相同的,它只是DLL的基地址(您可以使用Visual Studio中的“模块”窗口进行验证)。
通常,DLL在加载后不会移动,因此您应该能够在第一次调用时缓存返回的值,这样每次加载字符串时都可以节省额外函数调用的开销。