我有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 ?我的代码怎么样?
非常感谢!
答案 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>
,但后者是例外安全的。