我不知道为什么我不能在网上找到这个地方,但我怎么能访问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;
}
Run Code Online (Sandbox Code Playgroud)
你的问题就在于此std::shared_ptr<Test> f;.这条线类似于Test* f;; 你声明一个指向a的指针Test,但是你没有创建一个Test指向它的对象.你需要使用
std::shared_ptr<Test> f(std::make_shared<Test>());
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用原始指针访问成员f->x或(*f).x使用相同的成员.
你需要使用:
std::shared_ptr<Test> f = std::make_shared<Test>();
Run Code Online (Sandbox Code Playgroud)
然后你就可以访问了f->x.如果您有C++ 11,则可以auto使用关键字删除一些冗余并使用:
auto f = std::make_shared<Test>();
Run Code Online (Sandbox Code Playgroud)
请注意,作为一般规则,std :: make_shared()比
new直接使用"更好" .make_shared在一次内存分配中分配一个Test实例和shared_ptr所需的引用计数; 使用new意味着将有两个内存分配 - 一个用于新的Test实例,另一个用于内部使用的引用计数shared_ptr.与任何泛化一样,有时候make_shared不起作用(例如,当类使用自定义分配器时),但对于这个简单的情况,我认为使用make_shared更有帮助.