我正在检查某人的代码,并且看到了以下内容:
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()
。