Visual c++ GetModuleHandle函数是否会导致VC++;
我在函数中使用GetModuleHandle。每次我执行操作时都会调用该函数。我想知道如果该函数被反复调用,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何情况)。我实际上知道它什么时候被调用,什么时候到达断点。但我无法确定GetModuleHandle是否导致任何句柄泄漏。谁能帮我回答这个问题。谢谢,下面是在操作中反复调用的函数 void Myfunc(int-iCtrlID) { HINSTANCE hinst=GetModuleHandle(“r.dll”) s、 加载字符串(hinst,iCtrlID); // 这里有更多代码 //Visual c++ GetModuleHandle函数是否会导致VC++;,visual-c++,Visual C++,我在函数中使用GetModuleHandle。每次我执行操作时都会调用该函数。我想知道如果该函数被反复调用,GetModuleHandle是否会导致任何句柄泄漏(堆栈溢出或内存泄漏或其他任何情况)。我实际上知道它什么时候被调用,什么时候到达断点。但我无法确定GetModuleHandle是否导致任何句柄泄漏。谁能帮我回答这个问题。谢谢,下面是在操作中反复调用的函数 void Myfunc(int-iCtrlID) { HINSTANCE hinst=GetModuleHandle(“r.dll”
}您可以随意调用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函数。我只是想确定我的代码是否没有导致任何泄漏。从您的代码示例判断:不,您没有泄漏任何内容。谢谢,我每次都看到相同的句柄地址。