gpt4 book ai didi

c++ - 是否应处置 CreateEvent 返回的 HANDLE?

转载 作者:行者123 更新时间:2023-11-28 06:29:56 27 4
gpt4 key购买 nike

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

template<typename Data>
class ConcurrentQueue {

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

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

// Public Methods...

};

如您所见,此类中没有析构函数,dataPushEvent 未在此类中的任何位置显式释放。由于它是私有(private)成员,因此无法从外部访问它,所以我认为这可能会造成内存泄漏。

除非这个句柄不应该被释放。

我是 C++ 和 Windows 编程的新手。就我而言,HANDLE 是一个 void *,和所有指针一样,当我们用完它时应该释放它的引用。

我说得对吗?

最佳答案

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

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

在 C++11 中,您可以实现移动构造函数和移动赋值运算符,但您必须调整析构函数以考虑句柄可能已移动到另一个对象的事实,以便它不调用 CloseHandle()

关于c++ - 是否应处置 CreateEvent 返回的 HANDLE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27784323/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com