2016-03-05 71 views
0

如果一個句柄被創建爲一個函數參數,當函數結束時它會自行關閉嗎?在函數參數的句柄上調用CloseHandle?

如:

int readMem(HANDLE processHandle, int address) 
{ 
    int memValue = 0; 

    bool success = ReadProcessMemory(processHandle, (LPVOID)address, &memValue, sizeToReadBytes, NULL); 
    if (!success) 
     std::wcout << "Memory read failed on address: " << std::hex << address << "\n"; 

    return memValue; 
} 

我需要return語句之前顯式關閉它或者是它最好只是將它們作爲參考儘可能?

或者我只是誤解處理所有在一起?我對winapi很陌生。

+4

你在說processHandle嗎?不要關閉它,這個代碼的調用者創建它,以便它「擁有」它。它可能會用它來獲得更多。 –

回答

3

a HANDLE只是一個typedefvoid *

Microsoft明確指出,當您完成句柄時,請務必使用CloseHandle將其關閉。

您的readMem函數沒有創建句柄,因此關閉它是沒有意義的。

0

A HANDLE只是一個指針。如果您調用API函數來獲取某個句柄值,則需要在丟失句柄之前正確釋放它。同樣,如果你複製HANDLE,你不需要做任何事情,因爲它們只是一個指向資源的指針。

想象一下HANDLEvoid*(這可能是實際的類型)。如果你不得不對void*做些什麼,你應該去處理。

1

你總是必須明確地關閉句柄。

當其資源未被顯式或隱式使用並且不再需要時,應關閉句柄。不需要儘快關閉手柄。這取決於你何時關閉手柄。例如,爲了保持文件鎖定,你必須保持它的句柄打開。

如果您忘記關閉句柄,則會導致資源泄漏。爲了確保句柄始終是關閉的,請使用RAII方法:創建接受HANDLE作爲參數的類,不允許更改句柄,並在析構函數中調用CloseHandle。一旦你獲得了這個句柄並且保留了RAII包裝器實例,直到你不需要它爲止,用這個類包裝句柄。

如果您使用RAII並希望獲取一個例程中的句柄並在另一個例程中關閉,那麼您想要應用所有權的概念。在智能指針unique_ptrshared_ptr的幫助下,您可以將關閉句柄的責任從一個例程轉移到另一個例程。再次,這是安全的方法:智能指針自動釋放資源。

+0

這不回答這個問題:**當**應該關閉「HANDLE」時。 – IInspectable

+0

@IInspectable - 它回答這個問題(注意C++標籤)使用RAII - 然後當RAII實例超出範圍 – Mark

+0

時關閉@Mark:它沒有。它只是將責任轉移給其他人,並沒有解決核心問題。這立即導致一個後續問題:RAII對象何時應該超出範圍?根本沒有幫助。 – IInspectable

相關問題