初始化boost :: shared_ptr <a></a>类型变量的正确方法

时间:2014-04-30 08:33:51

标签: c++ visual-studio-2012 serialization boost

我不确定我是否正确,因此问这个问题。
reset boost::shared_ptr 指针的函数可用于初始化boost::shared_ptr<A>类型的变量。 下面是我在代码中完成的示例代码:

struct A
{

};

struct B
{
   int x;
   std::string ss;

   boost::shared_ptr<A> A_ref; 

};

setdata(struct B *b)
{
   b->x=10;
   b->ss="hello";

   b->A_ref.reset(new A()); // initializing A_ref variable using reset function.
}

上述初始化A_ref变量的方式是好还是有任何其他影响。

谢谢,

2 个答案:

答案 0 :(得分:2)

您可以使用构造函数和/或setter函数来避免独立函数:

#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>

struct A {};
struct B
{
   int x;
   std::string ss;
   boost::shared_ptr<A> A_ref;

   B()
   :    x(10), ss("hello"), A_ref(boost::make_shared<A>())
   {}

   void set();
};

void B::set() {
   x=10;
   ss="hello";
   A_ref = boost::make_shared<A>();
}

注意:make_shared更可取(参见@sehe的答案)。

旁注:您可以将setdata(struct B *b)替换为setdata(B *b)(在此省略不必要的结构)

答案 1 :(得分:1)

是的,这是重置共享指针的预期方法。

请参阅http://en.cppreference.com/w/cpp/memory/shared_ptr/reset

也支持赋值,并且具有类似的语义。

b->A_ref = boost::make_shared<A>();

通常首选Make-shared,因为

  • 它可以帮助在具有多个共享指针参数的函数调用中获得异常安全性
  • 它可以导致更有效的内存表示引用计数