【发布时间】:2013-02-12 20:40:42
【问题描述】:
在 VC2012 中,我想在构造函数中使用唯一指针和删除器创建互斥锁,这样我就不需要创建析构函数来调用 CloseHandle。
我原以为这会起作用:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
但在编译时出现错误:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
当我这样修改构造函数时:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
我得到了更不寻常的:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
我现在很茫然。 HANDLE 是 void* 的 typedef:我需要了解一些转换魔法吗?
【问题讨论】:
-
下面对您的问题有一个很好的答案,但我会认真考虑为 Mutex 滚动我自己的自定义所有者类,而不是为此目的利用 std::unique_ptr 的删除器。 HANDLE 是一个指针这一事实是一个实现细节。它可以很容易地成为一个索引或其他神奇的值。为它制作自己的 RAII 包装器,并让 unique_ptr 管理“真实”指针。
-
@Adrian:我明白你的意思。它还可以在构造函数/析构函数中包含 RAII 等待/释放配对。干杯。
标签: c++ winapi c++11 unique-ptr