Visual c++ GetModuleHandle函数是否会导致VC++;

Visual c++ GetModuleHandle函数是否会导致VC++;,visual-c++,Visual C++,我在函数中使用GetModuleHandle。每次我执行操作时都会调用该函数。我想知道如果该函数被反复调用,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何情况)。我实际上知道它什么时候被调用,什么时候到达断点。但我无法确定GetModuleHandle是否导致任何句柄泄漏。谁能帮我回答这个问题。谢谢,下面是在操作中反复调用的函数 void Myfunc(int-iCtrlID) { HINSTANCE hinst=GetModuleHandle(“r.dll”

我在函数中使用GetModuleHandle。每次我执行操作时都会调用该函数。我想知道如果该函数被反复调用,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何情况)。我实际上知道它什么时候被调用,什么时候到达断点。但我无法确定GetModuleHandle是否导致任何句柄泄漏。谁能帮我回答这个问题。谢谢,下面是在操作中反复调用的函数

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

s、 加载字符串(hinst,iCtrlID); // 这里有更多代码 //
}

您可以随意调用GetModuleHandle()。我的记忆是,如果您检查该值,通常在您的进程中每次返回的句柄都是相同的(在不同的进程中可能不同)。这不会导致任何内存泄漏

如果您关心dll的内存,可以在句柄上调用FreeLibrary()来卸载dll,但实际上这通常很棘手,大多数进程只会等待进程退出以卸载动态加载的模块

好的,我刚刚用以下代码测试了它:

  HANDLE h1 = GetModuleHandle(L"user32.dll");
  HANDLE h2 = GetModuleHandle(L"user32.dll");
  HANDLE h3 = GetModuleHandle(L"user32.dll");
每个句柄都是相同的,它只是DLL的基址(您可以使用Visual Studio中的“模块”窗口进行验证)

通常DLL在加载后不会移动,因此您应该能够缓存第一次调用时返回的值,这样您就可以在每次加载字符串时节省额外函数调用的开销。

来自:

GetModuleHandle函数返回一个 不带属性的映射模块的句柄 增加其引用计数。 因此,通过车辆时要小心 FreeLibrary函数的句柄, 因为这样做会导致DLL错误 要提前取消映射的模块


阅读:如果试图释放手柄,则会崩溃不要清理就可以了。

我在msdn库中读到了关于引用cont和免费库函数的定义。我不会将这些句柄传递给FreeLibrary函数。我只是想确定我的代码是否没有导致任何泄漏。从您的代码示例判断:不,您没有泄漏任何内容。谢谢,我每次都看到相同的句柄地址。