【发布时间】:2017-08-29 03:38:56
【问题描述】:
我见过几个 shared_ptr 的实现,例如here。他们都将ref_count 声明为int*。我不明白如果它只是一个int,我们会失去什么。谢谢!
template <class T>
class shared_ptr {
T* ptr;
int* ref_count;
/**
* Initializes the ref count used for tracking the usage.
*/
void initialize_ref_count() {
if (ref_count != nullptr)
return;
try {
ref_count = new int;
*ref_count = 1;
}
catch (std::bad_alloc& e) {
std::cerr << "Memory allocation error: " << e.what();
}
}
}
【问题讨论】:
-
如果它只是一个
int,它不会很共享。练习的重点是共享相同ptr的多个shared_ptr实例也共享相应的引用计数。 -
@o11c 为什么?我认为这不是重点
-
@o11c 在超过 40 亿所有者之间共享同一个对象的实际代码中,您会发现很少。
-
@o11c 有符号数字到底是如何邪恶的?现实世界的代码创建了超过 2³² 的对象,这也是选择一个对象同样糟糕的更多原因。但是我不认为你应该自动引用计数 2³² 对象
-
实际上是 unsigned 数字表现得“非常奇怪”。模 2^n 算法对于无符号值是唯一的,并且使它们主要适用于位字段,而不是实际整数。如果您可能需要符号位提供的额外容量,那么您几乎可以肯定只使用下一个更大的整数大小。
标签: c++ shared-ptr