【问题标题】:How can I use shared_ptr of boost in this situation?在这种情况下如何使用 boost 的 shared_ptr ?
【发布时间】:2013-09-18 17:04:30
【问题描述】:

我有 2 个班级,AB

在 A 类中,我在 B 上有一个名为 Bptr 的指针。

我在A的构造函数中为Bptr分配内存,在A的析构函数中释放Bptr的内存。

class B {
//whatever
public:
    B(int,int);
}

class A {
private:
    B * Bptr;
public:
    A();
}

A::A(){
    Bptr = new B(2,5);
}

A::~A(){
    delete Bptr;
}

如何在我的代码中集成 Boost 并使用智能指针:boost::shared_ptr?我的代码会是什么样子?

非常感谢!

【问题讨论】:

标签: c++ boost shared-ptr smart-pointers


【解决方案1】:

首先要问自己的问题:为什么要首先动态分配对象?你能用B 类型的成员替换指针吗?

假设有充分的理由,那么为什么要shared_ptr(而不是scoped_ptr,或者在现代C++ 中,unique_ptr)?为什么需要共享所有权?

一旦您回答了这些问题,并确定共享所有权是正确的解决方案,只需将 B* 替换为共享指针,在构造函数中对其进行初始化,然后去掉多余的析构函数(假设它不需要其他)。

class A {
private:
    boost::shared_ptr<B> Bptr;
public:
    A() : Bptr(boost::make_shared<B>(2,5)) {}
};

您可以简单地使用指针 Bptr(new B(2,5)) 对其进行初始化,但使用 make_shared 可以更有效地使用内存,并且(在比这更复杂的情况下)更容易确保异常安全。

【讨论】:

  • +1 聪明的问题。我的老板说它是用于多线程的。我没有验证他是否正确。
  • 为了使用,它会:Bptr->B_attribute_1,让B_attribute_1成为B的公共属性,对吧?谢谢
  • @user1459961:是的,智能指针提供*-&gt; 运算符,因此可以像常规指针一样取消引用。
  • 感谢您的回答! +1
【解决方案2】:
class B {
//whatever
public:
    B(int,int);
}

class A {
private:
    boost::shared_ptr<B> Bptr;
public:
    A();
}

A::A(){
    Bptr = boost::make_shared<B>(2,5);
}

A::~A(){
  // Bptr automatically deleted if this is the only boost::shared_ptr pointing to it
}

虽然您可以简单地使用new B(2,5) 而不是boost::make_shared&lt;B&gt;,但后者是异常安全的。

【讨论】:

  • 你能澄清一下条件吗:“如果这是唯一指向它的 boost::shared_ptr”?如果不是唯一的,我该如何处理?注意:我处于多线程上下文中。谢谢!
  • @user1459961:如果它不是唯一的所有者,那么销毁它只会释放其所有权份额而不删除对象。当最后一个共享指针被销毁时,该对象将被删除。你不应该做任何事情来处理它。
  • 感谢您的澄清。 +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2015-11-30
  • 2017-05-16
  • 2012-10-06
  • 2011-05-18
  • 2019-11-29
  • 2022-01-23
相关资源
最近更新 更多