c++ - 我可以以某种方式将套接字从winsock2.h传递到unique_ptr并为他制作自定义删除器吗?

标签 c++ unique-ptr winsock2

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

相关文章:

c++ - 在 vector<double> 上使用 std::max_element

c++ - 链接器如何处理定义在多个头文件中的虚函数?

c++ - 使用 scanf 在 C++ 中读取字符串

c++ - 为什么默认移动构造函数需要 unique_ptr 中使用的类的默认删除器?

c++ - 将 'new[]' 智能替换为 make_unique

c++ - VC11 Winsock 应用程序不会关闭

c++ - 找不到 boost_process cmake find_package

c++ - 我在这个套接字中错过了什么? (Windows 套接字)

c - I/O 完成端口中的 select() 等价

c++ - 为什么我的 bool 函数返回 true 会导致读取访问冲突?