在这种情况下如何使用boost的shared_ptr?

时间:2013-09-18 17:04:31

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

我有2个课程, A B

在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 ?我的代码怎么样?

非常感谢!

2 个答案:

答案 0 :(得分: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 :(得分:0)

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<B>,但后者是例外安全的。