如何使用带有 std::make_unique 的 WinAPI 的自定义删除器?
How to use a custom deleter using WinAPI with std::make_unique?
所以我只是在试验智能指针以及如何使用它们管理 Win32 HANDLE
对象,所以我想测试一下我编写的这个简单代码。
它应该为 std::unique_ptr
提供自定义删除器,以便在智能指针超出范围时使用。
template <typename Function>
class PtrDeleter
{
Function _Closer;
public:
void operator()(void* memBlock) const
{
_Closer(memBlock);
}
};
//The std::make_unique is the one causing the problem...
std::unique_ptr<void*, PtrDeleter<decltype(CloseHandle)>> ptr = std::make_unique<void*>(OpenThread(...));
我为 Function
参数使用模板的原因是因为我将使用 CloseHandle
的其他函数,例如 CoTaskMemFree
.
cannot convert from std::unique_ptr<void *,std::default_delete<_Ty>>' to 'std::unique_ptr<void *,PtrDeleter<BOOL (HANDLE)>>
这是编译器输出的内容。为什么它仍在尝试将 std::default_delete
与 std::make_unique
一起使用?
std::make_unique
无法使用自定义删除器创建 std::unique_ptr
。
您必须手动调用其构造函数。
std::unique_ptr<void*, PtrDeleter<decltype(&CloseHandle)>> ptr{nullptr, CloseHandle}
你的情况可以简化为
std::unique_ptr<void*,decltype(&CloseHandle)> ptr{nullptr, CloseHandle}
无需制作仿函数。
make_unique
returns unique_ptr
使用默认删除器。
要提供您的自定义版本,您必须调用 unique_ptr(Pointer,Deleter)
版本的 unique_ptr
ctor:
template <typename Function>
class PtrDeleter {
Function _Closer;
public:
void operator()(void* memBlock) const {
_Closer(memBlock);
}
};
int main() {
PtrDeleter<decltype(&CloseHandle)> deleter;
void* openThread = OpenThread(0,false,0);
std::unique_ptr<void, decltype(deleter)> ptr(openThread,deleter);
}
所以我只是在试验智能指针以及如何使用它们管理 Win32 HANDLE
对象,所以我想测试一下我编写的这个简单代码。
它应该为 std::unique_ptr
提供自定义删除器,以便在智能指针超出范围时使用。
template <typename Function>
class PtrDeleter
{
Function _Closer;
public:
void operator()(void* memBlock) const
{
_Closer(memBlock);
}
};
//The std::make_unique is the one causing the problem...
std::unique_ptr<void*, PtrDeleter<decltype(CloseHandle)>> ptr = std::make_unique<void*>(OpenThread(...));
我为 Function
参数使用模板的原因是因为我将使用 CloseHandle
的其他函数,例如 CoTaskMemFree
.
cannot convert from std::unique_ptr<void *,std::default_delete<_Ty>>' to 'std::unique_ptr<void *,PtrDeleter<BOOL (HANDLE)>>
这是编译器输出的内容。为什么它仍在尝试将 std::default_delete
与 std::make_unique
一起使用?
std::make_unique
无法使用自定义删除器创建 std::unique_ptr
。
您必须手动调用其构造函数。
std::unique_ptr<void*, PtrDeleter<decltype(&CloseHandle)>> ptr{nullptr, CloseHandle}
你的情况可以简化为
std::unique_ptr<void*,decltype(&CloseHandle)> ptr{nullptr, CloseHandle}
无需制作仿函数。
make_unique
returns unique_ptr
使用默认删除器。
要提供您的自定义版本,您必须调用 unique_ptr(Pointer,Deleter)
版本的 unique_ptr
ctor:
template <typename Function>
class PtrDeleter {
Function _Closer;
public:
void operator()(void* memBlock) const {
_Closer(memBlock);
}
};
int main() {
PtrDeleter<decltype(&CloseHandle)> deleter;
void* openThread = OpenThread(0,false,0);
std::unique_ptr<void, decltype(deleter)> ptr(openThread,deleter);
}