假设我有一个Boda课程:
class Boda {
...
};
我在这个类中有一个成员cydo
,我想成为一个智能指针(也就是说,我希望它在类被销毁后自动解除分配)。
我正在使用Boost的智能指针,所以我写道:
class Boda {
boost::shared_ptr<int> cydo;
public:
Boda () {
cydo = boost::shared_ptr<int>(new int(5));
}
};
这是否正确使用智能指针作为类成员?
谢谢,Boda Cydo。
答案 0 :(得分:10)
class Boda {
boost::shared_ptr<int> cydo;
public:
Boda () : cydo(new int(5)) {}
};
尽管如此,我想不出你为什么要包装int
......:)
答案 1 :(得分:2)
您应该问自己的真正问题是,您是否需要将该成员与该课程分开分配。如果你只是将成员存储在类中通常会更好 - 与存储任何类型的指针相比。如果你不能这样做,如果成员的生命周期在创建容器之前或之后开始,可以扩展到成员的所有权之外可以屈服于其他对象,那么你必须使用指针。
一旦需要使用指针,您应该更喜欢指向原始指针的智能指针,并根据您的要求选择特定类型。如果成员所有权不与其他对象共享,但是您需要使用指针,因为所包含对象的生命周期可能在容器的生命周期之前或之后开始,或者如果所有权可以转移到其他对象,则管理资源(除非产生)是容器的唯一责任,然后更喜欢unique_ptr
或auto_ptr
。
如果包含的对象不属于此类,则使用shared_ptr
。如果成员由不同的线程使用,也可以使用这个,即使所有权仅保留在其中一个线程中,每个线程都拥有自己的shared_ptr
,以避免在一个线程中仍然销毁该对象在另一个人中使用。