gpt4 book ai didi

c++ - 共享指针不增加 use_count

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:25 24 4
gpt4 key购买 nike

我正在尝试了解如何在 C++ 中使用 std::shared_ptr。但这很令人困惑,我不明白如何创建指向同一对象的多个共享指针。甚至文档和在线资料也不是很清楚。

以下是我编写的一小段代码,用于尝试理解 std::shared_ptr 的行为:

#include <iostream>
#include <memory>
using namespace std;

class Node
{
public:
int key;
Node()
{
key = 0;
}
Node(int k)
{
key = k;
}
};

int main()
{
Node node = Node(10);

shared_ptr<Node> ptr1((shared_ptr<Node>)&node);
cout << "Use Count: " << ptr1.use_count() << endl;

// shared_ptr<Node> ptr2=make_shared<Node>(node);//This doesn't increase use_count
shared_ptr<Node> ptr2((shared_ptr<Node>)&node);
cout << "Use Count: " << ptr2.use_count() << endl;

if (ptr1 == ptr2)
cout << "ptr1 & ptr2 point to the same object!" << endl;

if (ptr1.get() == ptr2.get())
cout << "ptr1 & ptr2 point to the same address!" << endl;

cout << "ptr1: " << ptr1 << " "
<< "ptr2: " << ptr2 << endl;
return 0;
}

根据我得到的输出,ptr1ptr2 都指向同一个 Node 对象,但是 use_count 两者都是 1。即使使用 std::make_shared 也不起作用,程序在退出前崩溃。

你能告诉我我做错了什么吗?以及如何创建多个指向同一对象的 shared_ptr

最佳答案

当您单独创建 shared_ptr(包括使用 make_shared)时,use_count 不会增加,它们根本不共享。创建的 shared_ptr 对其他 shared_ptr 和被管理的指针一无所知,甚至指针可能碰巧相同(请注意,这可能会导致多次破坏)。

您需要告诉哪些 shared_ptr 应该共享;当您从另一个 shared_ptr 创建 shared_ptr 时,use_count 会增加。例如

shared_ptr<Node> ptr1 = make_shared<Node>(10);
cout<<"Use Count: "<<ptr1.use_count()<<endl; // 1

shared_ptr<Node> ptr2(ptr1);
cout<<"Use Count: "<<ptr2.use_count()<<endl; // 2
cout<<"Use Count: "<<ptr1.use_count()<<endl; // 2

顺便说一句:正如评论所建议的那样,让 shared_ptr 管理指向 &node 的指针是危险的,它指向分配在堆栈上的对象。以下代码可能非常符合您的意图。

Node* node = new Node(10);

shared_ptr<Node> ptr1(node);
cout<<"Use Count: "<<ptr1.use_count()<<endl; // 1

shared_ptr<Node> ptr2(ptr1);
cout<<"Use Count: "<<ptr2.use_count()<<endl; // 2
cout<<"Use Count: "<<ptr1.use_count()<<endl; // 2

关于c++ - 共享指针不增加 use_count,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48220693/

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