是否应处置 CreateEvent 返回的 HANDLE?
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...
};
如您所见,class 上没有析构函数,class 中的任何地方都没有显式释放 dataPushEvent
。由于它是私有成员,因此无法从外部访问,所以我认为这可能会造成内存泄漏。
除非这个句柄不应该被丢弃。
我是 C++ 和 Windows 编程的新手。就我而言,HANDLE
是一个 void *
,和所有指针一样,当我们使用完它时应该释放它的引用。
我说得对吗?
如果没有析构函数,那么是的,句柄泄露了。应该有一个析构函数调用 CloseHandle()
来销毁事件。
作为旁注,class 还应删除 (C++11) 或使其不可访问 (C++03) 复制构造函数和复制赋值运算符,因为编译器生成的默认值不会有道理——它们可能会复制排队的数据,但仍然引用相同的事件句柄,导致多个看似独立的队列无缘无故地共享一个事件。当你实现析构函数时,默认的副本实现会更糟,因为一旦一个副本被破坏,它将破坏所有其他副本仍在使用的事件句柄!
在 C++11 中,您可以实现移动构造函数和移动赋值运算符,但您必须调整析构函数以解决句柄可能已移动到另一个对象的事实,因此它不调用 CloseHandle()
.
我在检查某人的代码时看到了这个:
template<typename Data>
class ConcurrentQueue {
private:
HANDLE dataPushEvent;
// More Private Members...
public:
ConcurrentQueue() {
dataPushEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
// Public Methods...
};
如您所见,class 上没有析构函数,class 中的任何地方都没有显式释放 dataPushEvent
。由于它是私有成员,因此无法从外部访问,所以我认为这可能会造成内存泄漏。
除非这个句柄不应该被丢弃。
我是 C++ 和 Windows 编程的新手。就我而言,HANDLE
是一个 void *
,和所有指针一样,当我们使用完它时应该释放它的引用。
我说得对吗?
如果没有析构函数,那么是的,句柄泄露了。应该有一个析构函数调用 CloseHandle()
来销毁事件。
作为旁注,class 还应删除 (C++11) 或使其不可访问 (C++03) 复制构造函数和复制赋值运算符,因为编译器生成的默认值不会有道理——它们可能会复制排队的数据,但仍然引用相同的事件句柄,导致多个看似独立的队列无缘无故地共享一个事件。当你实现析构函数时,默认的副本实现会更糟,因为一旦一个副本被破坏,它将破坏所有其他副本仍在使用的事件句柄!
在 C++11 中,您可以实现移动构造函数和移动赋值运算符,但您必须调整析构函数以解决句柄可能已移动到另一个对象的事实,因此它不调用 CloseHandle()
.