2016-03-05 69 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

相关问题