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

时间:2015-08-05 21:33:33

标签: c++ shared-ptr

我不知道为什么我无法在网上找到这个,但我如何通过class instance member variables访问shared_ptr?我尝试过的方法在下面的代码中被注释掉了。它们都导致segmentation fault

我假设我可以通过从raw pointer获取shared_ptr来访问成员变量,但我宁愿避免使用它,因为它不干净并且否定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;

    }

3 个答案:

答案 0 :(得分:6)

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

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

然后,您可以使用与原始指针相同的f->x(*f).x成员访问。

答案 1 :(得分:5)

您需要使用:

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

然后您可以访问f->x。如果您使用的是C ++ 11,则可以使用auto关键字删除一些冗余并使用:

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

请注意,作为一般规则,std :: make_shared()比直接使用new“更好”。 make_shared在一次内存分配中分配一个Test实例和shared_ptr所需的引用计数;使用new意味着将有两个内存分配 - 一个用于新的Test实例,另一个用于shared_ptr内使用的引用计数。与任何概括一样,有时候make_shared将不起作用(例如,当类使用自定义分配器时),但对于这个简单的情况,我认为使用make_shared会更有帮助。

答案 2 :(得分:1)

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

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