【发布时间】:2018-06-21 14:05:42
【问题描述】:
我正在尝试了解如何在 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;
}
根据我得到的输出,ptr1 和 ptr2 都指向同一个 Node 对象,但 use_count 对它们来说都是 1。即使使用std::make_shared 也不起作用,程序在退出前崩溃。
你能告诉我我做错了什么吗?以及如何创建多个指向同一个对象的shared_ptr(s)。
【问题讨论】:
-
(shared_ptr<Node>)&node在多个级别上都是错误的。 -
您通过说
ptr2 = ptr1;来增加使用次数,并且您不得获取局部变量的地址,因为它会在程序结束时尝试删除,并可怕地崩溃。 -
除了@VTT 的注释之外,您还创建了两个不同的指针,它们是共享指针。不是共享一个指针。
-
顺便说一句,这个参考站点有a good example(但线程可能使它更复杂一些)。
-
虽然在创建
ptr1&ptr2时会创建并传递共享指针,但这些都是临时的,会被销毁或得到moved。
标签: c++ c++11 shared-ptr reference-counting make-shared