gpt4 book ai didi

c++ - 为什么 shared_ptr 实现中的 ref_count 是 int*

转载 作者:可可西里 更新时间:2023-11-01 17:38:49 26 4
gpt4 key购买 nike

我见过几个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();
}
}
}

最佳答案

正如您在提供的实现中看到的那样 ( in your link ),当共享指针是复制构造复制赋值 时,指向引用计数器的指针 ( ref_count) 在管理相同指针的所有实例之间共享:

    // Copy constructor
shared_ptr(const shared_ptr& copy) {
ptr = copy.ptr;
ref_count = copy.ref_count; // see here
if (ref_count != nullptr) {
++(*ref_count);
}
}

// Assignment operator
shared_ptr& operator=(const shared_ptr& copy) {
ptr = copy.ptr;
ref_count = copy.ref_count; // see here
if (ref_count != nullptr) {
++(*ref_count);
}
return *this;
}

那样的话,那个共享指针的所有实例,引用同一个内存位置来跟踪ref计数器,最后的shared_ptr就能知道如果它需要清理(删除分配的内存):

   ~shared_ptr() {
--(*ref_count);
if (*ref_count == 0) {
delete ref_count;
ref_count = nullptr;
delete ptr;
ptr = nullptr;
}
}

免责声明

为简单起见,此答案基于 OP 提供的示例。 shared_ptr 实现比示例中的实现复杂得多(考虑原子性、竞争条件等...)。

关于c++ - 为什么 shared_ptr 实现中的 ref_count 是 int*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45930313/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com