【发布时间】:2012-01-10 07:07:03
【问题描述】:
出于引用计数的目的,在下面的示例代码中使用 std::tr1::shared_ptr 是否安全且正确? (这只是一个特定的示例,该类可以包含其他任何内容(void*)而不是 FILE*)
class File
{
public:
File(const char* path, const char* mode) :
_refcount(new int(0))
{
this->_file = fopen(path, mode);
}
~File()
{
if (this->_refcount.unique())
{
if (this->_file != NULL)
{
fclose(this->_file);
}
}
}
int write(void* buff, size_t size)
{
fwrite(buff, size, 1, this->_file);
}
private:
FILE* _file;
std::tr1::shared_ptr<int> _refcount;
};
【问题讨论】:
-
安全在什么意义上?内存安全吗?线程安全吗?
-
@KennyTM 是的,内存安全和线程安全,以及从任何其他角度来看。 (我想它不是线程安全的,也许你可以解释一下如何修复它)
-
我没有说它不是线程安全的 ;) 但我会像 James 的解决方案一样写这个,而不是显式的 ref-counter。
-
乍一看,我在您的示例中没有看到任何明显的数据竞争。如果
unique()返回true,那么拥有FILE*的唯一实例就是被销毁的实例,因此没有其他实例可以复制,因此unique()无法再次不再为true。当然,通过多个线程的单个FILE*执行 I/O 只能以眼泪收场。 /cc @KennyTM
标签: c++ shared-ptr smart-pointers tr1 reference-counting