问题描述
我可以以某种方式将套接字从winsock2.h传递给unique_ptr并为他创建自定义删除器吗? 像这样:
std::unique_ptr<SOCKET,deleter> up(new socket(...),deleter);
解决方法
是的,有可能,例如:
struct SocketDeleter
{
using pointer = SOCKET;
// or,if nenecessary:
// typedef SOCKET pointer;
void operator()(SOCKET sckt) const {
if (sckt != INVALID_SOCKET)
closesocket(sckt);
}
};
std::unique_ptr<SOCKET,SocketDeleter> up(socket(...));
但是,SOCKET
不是指针类型(它是UINT
),std::unique_ptr
并非真正打算与非指针类型一起使用。
您可以执行以下操作:
struct SocketDeleter
{
void operator()(SOCKET* sckt) const {
if (*sckt != INVALID_SOCKET)
closesocket(sckt);
delete sckt;
}
};
std::unique_ptr<SOCKET,SocketDeleter> up(new SOCKET(socket(...)),SocketDeleter{});
但这变得很难看。
有关为套接字描述符设计RAII样式包装器而不使用std::unique_ptr
的替代方法,请参见smart pointer to manage socket file descriptor。