【发布时间】:2016-07-04 22:56:16
【问题描述】:
在包装资源的代码中,该资源应该被释放一次且只释放一次,执行以下类似的操作来保证这一点是惯用的吗?有没有更好的方法?
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};
};
【问题讨论】:
-
你应该使用 -1 因为 0 是一个有效的 FD。
-
谢谢,我会编辑的。
-
是的,这是惯用的。不,我不知道有什么更好的方法。请注意,我同意@ysdx,但我会说使用为目标平台指定的任何无效值(
INVALID_SOCKET、-1等)。 -
那么您应该更改 dtor 中的检查,因为任何非零 int 的计算结果都是 true。也就是说,在这种成员复杂度较低的情况下,我会根据移动赋值运算符定义移动 ctor - 你保证它们在这种情况下匹配。
-
我想你会想要修复你的析构函数,因为你已经更新了
fd的初始值。
标签: c++ c++11 move-semantics raii