如何在Windows HANDLEs中使用C++标准智能指针?

dev*_*imi 8 c++ winapi c++11

我想知道是否有办法使用unique_ptr<T>Windows HANDLEs?

我正在考虑std::default_delete用特定的handle_trats呼叫替换CloseHandle.问题是HANDLE定义为void* unique_ptr<void>无法编译,因为sizeof(void)未定义.

到目前为止,我只看到两种可能性:

  1. 创建手柄的包装类,并使用它像这样:unique_ptr<new CHandle(h)>.这几乎使unique_ptr<T>自己无用.
  2. 使用HANDLE类似的特定智能指针类unique_ptr<T>.

您认为更好的选择是什么?你会建议什么?

这个问题可以扩展为COM IUnknown指针 - 可以CComPtr用任何标准智能指针代替吗?

Pup*_*ppy 9

可以扩展COM IUnknown指针的问题 - CComPtr可以被任何标准智能指针替换吗?

是.您不专门std::default_deleter,只需替换删除器类型.

struct COMDeleter {
    template<typename T> void operator()(T* ptr) {
        ptr->Release();
    }
};
unique_ptr<IUnknown, COMDeleter> ptr; // Works fine
Run Code Online (Sandbox Code Playgroud)

同样的原则同样适用shared_ptrHANDLE.


Sev*_*yev 6

创建一个特定的智能指针类,不会花费很长时间.不要滥用图书馆类.句柄语义与C++指针的语义完全不同; 首先,取消引用一个手柄是没有意义的.

使用自定义智能句柄类的另一个原因 - NULL并不总是意味着一个空句柄.有时它是INVALID_HANDLE_VALUE,它不相同(实际上是-1).