我的班级中有一个 HANDLE 作为成员,说它是使用 win32 api 获得的文件句柄,我如何在复制构造函数中处理它,我的班级是否负责释放它?
3 回答
您遇到此问题是因为您尝试为包含抽象资源(而不是值)的类定义复制构造函数。您必须从复制构造函数中确定您真正想要的行为。也许您甚至不希望该类首先是可复制构造的。
例如,假设您的类封装了一个打开的只读文件。然后,复制构造函数调用 DuplicateHandle(如 Matt 所建议的)和析构函数调用 CloseHandle 是有意义的。原始实例和复制的实例之间不会有干扰,因为您不会写入文件。
另一方面,如果该类表示一个临时文件,则可能需要不同的语义 - 复制构造函数复制整个文件可能会很有用,这样您的类的副本就不会干扰原始文件。或者这种行为感觉太隐含了,你决定这个类不会有一个复制构造函数,而是你必须显式地使用一个复制方法。
所以,除非你解释你到底在做什么,以及你打算以何种方式使用课程,否则没有“正确”的答案。
如果要复制句柄,可以在复制构造函数中使用 Windows API DuplicateHandle,在这种情况下,如果不再使用句柄,则调用 Closehandle。
正如其他人所建议的那样,DuplicateHandle 在这里可能最有意义,但由于 HANDLE 基本上是一个指针,因此您也可以使用 std::shared_ptr (或它的 boost 对应物)和 CloseHandle 作为删除器。然后,可以随意复制句柄,并在销毁类的最后一个实例时自动关闭句柄。
请注意,句柄是共享的,因此如果您修改其任何关联状态,您会为所有引用该句柄的实例更改它。如果这是一个问题,我会复制它或完全禁止复制。