我正在检查某人的代码,并且看到了以下内容:

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中,您可以实现move-constructor和move-assignment运算符,但是您必须调整析构函数,以考虑到句柄可能已移动到另一个对象这一事实,因此它不会呼叫CloseHandle()

10-04 23:17
查看更多