2010-01-27 53 views
2

任何泄漏(堆棧溢出和內存泄漏),我在我的函數中使用的GetModuleHandle。每次執行操作時都會調用該函數。我想知道這個函數是否被一次又一次地調用,GetModuleHandle會導致任何句柄泄漏(堆棧溢出或內存泄漏或其他)。我實際上知道它什麼時候被調用,什麼時候中斷點被擊中。但我無法弄清楚GetModuleHandle是否導致任何處理泄漏。任何人都可以幫我解答。謝謝,下面是在一個操作中重複調用的函數。確實的GetModuleHandle函數導致VC++

void Myfunc(int iCtrlID) HINSTANCE hinst = GetModuleHandle(「r.dll」);

s.LoadString(HINST,iCtrlID);這裏 // // 更多的代碼}

回答

3

你可以調用的GetModuleHandle()所有你想要的。我的回憶是,如果你檢查價值,通常它是你的過程中每次返回相同的句柄(它可能會在不同的過程中有所不同)。這不會導致任何內存泄漏。

如果你關心內存,你可以調用句柄上的FreeLibrary()來卸載dll,但實際上這往往是棘手的,大多數進程只是等待進程退出以卸載動態加載的模塊。

好吧,我只是用下面的代碼進行了測試:

HANDLE h1 = GetModuleHandle(L"user32.dll"); 
    HANDLE h2 = GetModuleHandle(L"user32.dll"); 
    HANDLE h3 = GetModuleHandle(L"user32.dll"); 

每個手柄是一樣的,它只是DLL的基地址(您可以通過使用Visual Studio中的模塊窗口確認) 。

通常,DLL在加載後不會四處移動,所以您應該可以緩存第一次調用時返回的值,因此每次要加載字符串時都可以節省額外函數調用的開銷。

+0

謝謝,我每次看到句柄的地址。 – rajat 2010-01-27 18:13:40

5

documentation

的的GetModuleHandle函數返回一個 把手到映射模塊,而不 遞增其引用計數。 因此,經過 手柄時FreeLibrary函數, 要謹慎,因爲這樣做可能會導致一個DLL 模塊是映射的過早。

閱讀:如果您嘗試釋放手柄,則會崩潰。 不要清理,你很好。

+0

我在msdn庫中閱讀了有關引用cont和免費庫函數的定義。我沒有將這些句柄傳遞給FreeLibrary函數。我只想確定我的代碼是否不會造成任何泄漏。 – rajat 2010-01-27 17:54:52

+0

從你的代碼示例判斷:不,你沒有泄漏任何東西。 – 2010-01-27 18:05:09

+0

謝謝亞歷山大。 – rajat 2010-01-27 18:14:57