如何通过std::shared_ptr访问实例成员变量?

How to access instance member variables via std::shared_ptr?

我不知道为什么我在网上找不到这个,但是我怎样才能通过 shared_ptr? 访问 class instance member variables 我尝试过的方法在下面的代码中被注释掉了.它们都产生了 segmentation fault

我假设我可以通过从 shared_ptr 获取 raw pointer 来访问成员变量,但我宁愿避免这样做,因为它不干净并且否定了 shared_ptr 的值访问这些成员变量的安全方法是什么?

#include <memory>
#include <iostream>

class Test{
public:
  int x;
  Test() : x(5){}
};

int main()
{
  std::shared_ptr<Test> f;
 // the following lines both produce seg faults
 //  std::cout << (*f).x << std::endl;
 //  std::cout << f->x << std::endl;

    }

您需要使用:

std::shared_ptr<Test> f = std::make_shared<Test>();

然后就可以访问f->x了。如果你有 C++11,你可以使用 auto 关键字删除一些冗余并使用:

auto f = std::make_shared<Test>();

Note that as a general rule, std::make_shared() is "better" than using new directly. make_shared allocates an instance of Test and the reference count needed for the shared_ptr in one memory allocation; using new means there will be two memory allocations--one for the new Test instance and one for the reference count used inside the shared_ptr. As with any generalization, there are times when make_shared will not work (e.g., when the class uses a custom allocator), but for this simple case, I think using make_shared is more helpful.

您必须实例化共享数据。像这样:

std::shared_ptr<Test> f( new Test());

你的问题出在std::shared_ptr<Test> f;线上。该行类似于 Test* f;;您声明了一个指向 Test 的指针,但您还没有创建一个 Test 对象供其指向。你需要使用

std::shared_ptr<Test> f(std::make_shared<Test>());

然后您可以使用 f->x(*f).x 访问成员,就像访问原始指针一样。