Dee*_*Jay 4 c++ reference-counting shared-ptr make-shared c++11
我试图了解如何std::shared_ptr在C++中使用.但它很混乱,我不明白如何创建指向同一对象的多个共享指针.即使是文档和在线资料也不是很清晰.
以下是我编写的一小段代码,用于尝试和理解其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;
}
Run Code Online (Sandbox Code Playgroud)
根据我得到的,无论是产量ptr1,并ptr2都指向同一Node对象,但use_count为1对他们俩的.即使使用std::make_shared不起作用,程序在退出前崩溃.
你能告诉我我做错了什么吗?以及如何创建shared_ptr指向同一对象的多个(s).
shared_ptr单独创建s(包括使用make_shared)时,use_count不会增加,它们根本不会共享.创建者shared_ptr对其他shared_ptrs和被管理的指针一无所知,即使指针可能恰好相同(注意它可能会导致多次破坏).
你需要分辨哪些shared_ptr应该分享 ; 当您shared_ptr从另一个创建时,use_count会增加shared_ptr.例如
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
Run Code Online (Sandbox Code Playgroud)
顺便说一句:正如评论所说,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
Run Code Online (Sandbox Code Playgroud)