用 unique_ptr 管理 Windows HANDLE
作为一个曾经的资深 Windows developer,Windows HANDLE
一个不引人注意的但是绝对值得引起注意的地方是,它的无效值表示是不唯一的。
除了最常见的 NULL
之外还有一个 INVALID_HANDLE_VALUE
,并且即使是在数值上这两个东西也不一样。
如果要为 HANDLE
写一个 C++ RAII Wrapper 那么必须要考虑这个点,比如 Chromium 就是这么做的。
Chromium 的这个设施早在 C++ 11 之前就有了,并且经过多年来的迭代已经变得异常复杂;如果你自己需要这样一个东西,又无法从 Chromium 这种工业项目中抽取一个组件的话,只能考虑自己实现。
但是要写对一个工业强度的 handle-wrapper 并不容易,同时还要考虑到通用性和实用性,比如可能后续要支持 fd/socket,Windows HDC 等各种奇奇怪怪的东西。
所以能否用 std::unique_ptr
来作为基础实现,针对一些特定细节做泛化?
这就引出一个问题:如果希望用 std::unique_ptr
来作为 HANDLE
的一个 RAII 包装,如何正确判断一个 handle 是否 valid?
更进一步,问题还可以变为:如何用 std::unique_ptr
管理 pointer-like 的资源?