GetModuleHandle函数是否会导致VC ++中的任何泄漏(堆栈溢出和内存泄漏)

时间:2010-01-27 17:25:07

标签: visual-c++

我在我的函数中使用GetModuleHandle。每次进行操作时都会调用该函数。我想知道是否一次又一次地调用该函数,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何问题)。我实际上知道什么时候被调用以及什么时候被击中。但我无法弄清楚GetModuleHandle是否导致任何句柄泄漏。任何人都可以帮我解答。谢谢,以下是在操作中重复调用的函数。

void Myfunc(int iCtrlID) { HINSTANCE hinst = GetModuleHandle(“r.dll”);

s.LoadString(hinst,iCtrlID); // 这里有更多代码 // }

2 个答案:

答案 0 :(得分:5)

来自documentation

  

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在加载后不会移动,因此您应该能够在第一次调用时缓存返回的值,这样每次加载字符串时都可以节省额外函数调用的开销。