用于资源的惯用移动构造函数,只能在析构函数中释放一次

时间:2016-07-04 22:56:16

标签: c++ c++11 move-semantics raii

在包装应该被释放一次且仅一次的资源的代码中,是否习惯于执行以下操作来保证这一点?有一种更好的方法吗?

class SocketWrapper { 
    SocketWrapper() {
        fd = socket(AF_INET, SOCK_STREAM, 0);
    }

    ~SocketWrapper() {
        if(fd < 0){
            close(fd);
        }
    }

    SocketWrapper(SocketWrapper &&other){
        fd = other.fd;
        other.fd = -1;
    }
    //similar move assignment   

private: 
    int fd{-1};
};

2 个答案:

答案 0 :(得分:0)

您应该删除该类的复制构造函数以确保安全。

SocketWrapper(const SocketWrapper&) = delete;

这应该是安全的,但我想如果你想要创建一次资源,你可以使用单例。有些库可以提供开箱即用的单例功能。例如: - Folly singleton

此外,它始终建议重用提供原始套接字的exiting包装的库,并且经过广泛测试,因此可以使用而不是重写整个包装愚蠢的AsyncSocket,它提供类似的抽象,除非你想要只是基本的fd包装功能。

答案 1 :(得分:0)

我想赞扬你使用类似智能指针的策略。 shared_ptr和unique_ptr都用于管理指针资源。

对于不同数量的拥有者,您可以选择一个。价:Differences between unique_ptr and shared_ptr