是否应该处理由CreateEvent返回的HANDLE?

时间:2015-01-05 17:01:49

标签: c++ windows winapi handle

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

template<typename Data>
class ConcurrentQueue {

    private:
        HANDLE dataPushEvent;
        // More Private Members...

    public:
        ConcurrentQueue() {
            dataPushEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        }

    // Public Methods...

};

正如您所看到的,此类上没有析构函数,并且dataPushEvent未在此类中的任何位置显式释放。由于它是私人会员,因此无法在外部加入,因此我认为这可能会造成内存泄漏。

除非不应该处理这个句柄。

我是C ++和Windows编程的新手。就我而言,HANDLEvoid *,作为所有指针,当我们使用它时,它的引用应该被释放。

我是对的吗?

1 个答案:

答案 0 :(得分:1)

如果没有析构函数,那么是,句柄泄漏了。应该有一个析构函数调用CloseHandle()来销毁事件。

作为旁注,该类还应该删除(C ++ 11)或使不可访问(C ++ 03)复制构造函数和复制赋值运算符,因为编译器生成的默认值没有意义 - 它们是可能会复制排队的数据,但仍引用相同的事件句柄,导致多个看似独立的队列无缘无故地共享事件。当你实现析构函数时,默认的副本实现会更糟糕,因为一旦一个副本被破坏,它将破坏所有其他副本仍在使用的事件句柄!

在C ++ 11中,你可以实现move-constructor和move-assignment操作符,但是你必须调整你的析构函数来解释这个句柄可能已被移动到另一个对象的事实,以便它不会致电CloseHandle()