在作为函数参数的句柄上调用 CloseHandle

Call CloseHandle on handle that is a function parameter?

本文关键字:句柄 调用 CloseHandle 参数 函数      更新时间:2023-10-16

如果将句柄创建为函数参数,当函数结束时它会自行关闭吗?

例如:

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 很陌生。

HANDLE只是对

void *typedef

Microsoft明确规定,当您完成手柄时,请务必使用 CloseHandle 将其关闭。

您的readMem函数没有创建句柄,因此将其关闭在那里没有意义。

您始终必须显式关闭句柄。

当句柄

的资源未显式或隐式使用且不再需要时,应关闭句柄。不需要尽快关闭手柄。何时关闭句柄由您决定。例如,要保持文件锁定,您必须保持其句柄打开。

如果忘记关闭句柄,则会泄漏资源。若要确保句柄始终关闭,请使用 RAII 方法:创建接受HANDLE作为参数的类,不允许再更改句柄并在析构函数中调用CloseHandle。获取此句柄后立即使用此类包装句柄,并保留 RAII 包装器实例,直到不需要它为止。

如果使用 RAII 并希望在一个例程中获取句柄并在另一个例程中关闭,则需要应用所有权概念。您可以在智能指针的帮助下将关闭句柄的责任从一个例程转移到另一个例程unique_ptrshared_ptr。同样,这是安全的方法:智能指针自动释放资源。

HANDLE只是一个指针。如果调用 API 函数来获取某个句柄值,则需要在丢失句柄之前正确释放它。同样,如果您复制HANDLE,则无需执行任何操作,因为它们只是指向资源的指针。

想象一下HANDLEvoid*(这可能是实际类型)。如果你必须对void*做某事,你应该对手柄做。