我不知道为什么我无法在网上找到这个,但我如何通过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;
}
答案 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());