如何通过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
访问成员,就像访问原始指针一样。
我不知道为什么我在网上找不到这个,但是我怎样才能通过 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; usingnew
means there will be two memory allocations--one for the new Test instance and one for the reference count used inside theshared_ptr
. As with any generalization, there are times whenmake_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
访问成员,就像访问原始指针一样。