我可以通过某种方式将套接字从winsock2.h传递给unique_ptr并为他创建自定义删除器吗?

问题描述

我可以以某种方式将套接字从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