C++ 调用函数参数句柄上的CloseHandle?

C++ 调用函数参数句柄上的CloseHandle?,c++,winapi,C++,Winapi,如果一个句柄被创建为函数参数,它会在函数结束时自动关闭吗 例如: int readMem(句柄进程句柄,int地址) { int memValue=0; bool success=ReadProcessMemory(processHandle,(LPVOID)地址和memValue,sizeToReadBytes,NULL); 如果(!成功) std::wcoutAHANDLE只是一个指针。如果调用API函数来获取某个句柄值,则需要在丢失句柄之前正确释放它。同样,如果复制HANDLE的周围,则无

如果一个句柄被创建为函数参数,它会在函数结束时自动关闭吗

例如:

int readMem(句柄进程句柄,int地址)
{
int memValue=0;
bool success=ReadProcessMemory(processHandle,(LPVOID)地址和memValue,sizeToReadBytes,NULL);
如果(!成功)

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


假设
句柄
void*
(可能是实际类型)。如果必须对
void*
执行某些操作,则应该对句柄执行该操作。

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


想象一下
HANDLE
void*
(可能是实际的类型)。如果你必须对
void*
做些什么,你应该对HANDLE做些什么。

a
HANDLE
只是
typedef
void*
的一个
类型

Microsoft明确指定,当您使用完句柄时,请确保使用
CloseHandle
将其关闭


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

a
handle
只是一个
typedef
void*

Microsoft明确指定,当您使用完句柄时,请确保使用
CloseHandle
将其关闭


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

始终必须显式关闭句柄

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

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


如果您使用RAII并希望在一个例程中获取句柄,然后在另一个例程中关闭,那么您需要应用所有权概念。您可以借助智能指针
unique\u ptr
shared\u ptr
将关闭句柄的责任从一个例程转移到另一个例程。同样,这是一种安全的方法:智能指针自动释放资源ally.

您始终必须显式关闭句柄

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

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


如果您使用RAII并希望在一个例程中获取句柄,然后在另一个例程中关闭,那么您需要应用所有权概念。您可以借助智能指针
unique\u ptr
shared\u ptr
将关闭句柄的责任从一个例程转移到另一个例程。同样,这是一种安全的方法:智能指针自动释放资源ally.

您是在谈论processHandle吗?不要关闭它,此代码的调用方创建它是为了“拥有”它。它可能会使用它进行更多操作。您是在谈论processHandle吗?不要关闭它,此代码的调用方创建它是为了“拥有”它可能会用到更多。这不回答问题:什么时候<代码>句柄被关闭。@ iTestTable——它有点回答问题(注释C++标签)使用RAII-当RAII实例退出时,它将关闭scope@Mark:没有。它只是将责任转移给其他人,而没有解决核心问题。这立即导致了一个后续问题:RAII对象何时应该超出范围?一点帮助都没有。它在构建的同一范围内超出范围iue承包商有责任按照以下要求进行结算:well@Mark:好的,现在RAII对象应该在哪个范围内声明?它是否应该转移所有权(这确实是要问的问题)?不管你怎么说,这个答案根本不能解决这个问题。编辑也没有多大帮助:例如,打开的文件句柄并不意味着文件锁定。编写
句柄
-包装比你想象的要难(不同的API对有效的
句柄
值有不同的范围)这不回答问题:什么时候<代码>句柄被关闭?@ IcTestTable——它有点回答问题(注释C++标签)使用RAII-当RAII实例退出时,它将关闭scope@Mark:没有。它只是将责任转移给其他人,而没有解决核心问题。这立即导致了一个后续问题:RAII对象何时应该超出范围?一点帮助都没有。它在构建的同一范围内超出范围iue承包商有责任关闭
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;
}