在包装应该被释放一次且仅一次的资源的代码中,是否习惯于执行以下操作来保证这一点?有一种更好的方法吗?
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};
};
答案 0 :(得分:0)
您应该删除该类的复制构造函数以确保安全。
SocketWrapper(const SocketWrapper&) = delete;
这应该是安全的,但我想如果你想要创建一次资源,你可以使用单例。有些库可以提供开箱即用的单例功能。例如: - Folly singleton。
此外,它始终建议重用提供原始套接字的exiting包装的库,并且经过广泛测试,因此可以使用而不是重写整个包装愚蠢的AsyncSocket,它提供类似的抽象,除非你想要只是基本的fd包装功能。
答案 1 :(得分:0)
我想赞扬你使用类似智能指针的策略。 shared_ptr和unique_ptr都用于管理指针资源。
对于不同数量的拥有者,您可以选择一个。价:Differences between unique_ptr and shared_ptr