是否应该释放 CreateEvent 返回的句柄

Should HANDLE returned by CreateEvent be disposed?

本文关键字:返回 句柄 CreateEvent 释放 是否      更新时间:2023-10-16

我正在检查某人的代码,我看到了这个:

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()