我可以以某种方式将套接字从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{});
但这只会变得丑陋。
参见smart pointer to manage socket file descriptor了解在不使用 std::unique_ptr
的情况下为套接字描述符设计 RAII 样式包装器的替代方法。
关于c++ - 我可以以某种方式将套接字从winsock2.h传递到unique_ptr并为他制作自定义删除器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64360484/