在作为函数参数的句柄上调用 CloseHandle
Call CloseHandle on handle that is a function parameter?
如果将句柄创建为函数参数,当函数结束时它会自行关闭吗?
例如:
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_ptr
或shared_ptr
。同样,这是安全的方法:智能指针自动释放资源。
HANDLE
只是一个指针。如果调用 API 函数来获取某个句柄值,则需要在丢失句柄之前正确释放它。同样,如果您复制HANDLE
,则无需执行任何操作,因为它们只是指向资源的指针。
想象一下HANDLE
被void*
(这可能是实际类型)。如果你必须对void*
做某事,你应该对手柄做。
相关文章:
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 如何获取边缘窗口句柄 (HWND)?
- 枚举进程模块在有效句柄上返回无效句柄
- 在 c/c++ 中打开 PhysicalDrive 的句柄并写入 MBR 的 linux 等效是什么?
- 从运行服务的应用程序代码中提取窗口句柄
- 在读取文件后重置句柄
- 是否有像地图这样的C++结构,但我得到的不是值的键,而是值的句柄?
- Microsoft ODBC 无法创建有效的句柄
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 获取特定进程的句柄数
- C++ 创建 NdisProt 驱动程序的句柄
- 调用posix_spawn时关闭所有文件句柄
- C++/CLI中重复的析构函数调用和跟踪句柄
- 谁负责为线程句柄调用 CloseHandle()
- 在作为函数参数的句柄上调用 CloseHandle
- 关闭句柄调用上的句柄异常无效
- 传递给函数调用后的空指针sqlite3句柄
- 调用IOCTLSTORAGE_GET_MEDIA_SERIAL_NUMBER时句柄无效
- 在析构函数中调用CloseHandle会导致运行时内存错误,即如何正确关闭结构/类中的文件句柄
- Boost::asio::strand::dispatch(句柄)或直接调用句柄