是否应该释放 CreateEvent 返回的句柄
Should HANDLE returned by CreateEvent be disposed?
我正在检查某人的代码,我看到了这个:
template<typename Data>
class ConcurrentQueue {
private:
HANDLE dataPushEvent;
// More Private Members...
public:
ConcurrentQueue() {
dataPushEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
// Public Methods...
};
如您所见,此类上没有析构函数,并且dataPushEvent
在此类中的任何位置都没有显式释放。由于它是私有成员,因此无法从外部访问,因此我认为这可能会造成内存泄漏。
除非不应该处理此句柄。
我是C++和Windows编程的新手。就我而言,HANDLE
是一个 void *
,并且与所有指针一样,当我们使用它时,应该释放它的引用。
我说的对吗?
如果没有析构函数,那么是的,句柄泄漏。 应该有一个析构函数调用CloseHandle()
来销毁事件。
作为旁注,该类还应删除 (C++11) 或使复制构造函数和复制赋值运算符不可访问 (C++03),因为编译器生成的默认值没有意义 - 它们可能会复制排队的数据,但仍引用相同的事件句柄,导致多个看似独立的队列无缘无故地共享一个事件。当你实现析构函数时,默认的复制实现会更糟,因为一旦一个副本被破坏,它将破坏所有其他副本仍在使用的事件句柄!
在 C++11 中,您可以实现移动构造函数和移动赋值运算符,但您必须调整析构函数以说明句柄可能已移动到另一个对象,以便它不会调用 CloseHandle()
。
相关文章:
- 枚举进程模块在有效句柄上返回无效句柄
- Windows 函数"GetCursorInfo"返回成功,但光标的句柄为 NULL
- 函数返回的临时unique_ptr句柄
- Windows句柄始终返回Invalid_handle_value
- 发布信号量返回错误 6(无效句柄)
- 返回对象的实例并通过句柄使用它
- Windows HANDLE RAII 管理,如果返回布尔值而不是句柄怎么办?
- DirectShow BindToObject返回无效句柄
- DoModal 返回 -1 Getlasterror 说句柄无效
- 是否应该释放 CreateEvent 返回的句柄
- 为什么这个非常简单的返回 std::move(线程句柄)失败
- GetFinalPathByHandle为NtQuerySystemInformation返回的所有句柄返回相同的路径
- c++设计:继承和返回不透明句柄
- WNDPROC窗口回调过程中接收到的句柄与CreateWindow返回的句柄之间的差异
- 为什么未初始化的返回值会导致createwindowwex的无效窗口句柄错误
- 不存储函数返回句柄时的内存管理
- FindFirstFile总是返回无效句柄
- c++ Win32.SelectObject失败,GetLastError返回错误1400(无效窗口句柄)
- GetThreadContext返回错误6,无效句柄
- OpenProcess函数返回无效句柄