在C ++中将智能指针放在类数据(作为类成员)中的正确方法是什么?

时间:2010-08-14 11:33:49

标签: c++ shared-ptr smart-pointers class-members

假设我有一个Boda课程:

class Boda {
    ...
};

我在这个类中有一个成员cydo,我想成为一个智能指针(也就是说,我希望它在类被销毁后自动解除分配)。

我正在使用Boost的智能指针,所以我写道:

class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () {
            cydo = boost::shared_ptr<int>(new int(5));
        }
};

这是否正确使用智能指针作为类成员?

谢谢,Boda Cydo。

2 个答案:

答案 0 :(得分:10)

class Boda {
    boost::shared_ptr<int> cydo;
    public:
        Boda () : cydo(new int(5)) {} 
};

尽管如此,我想不出你为什么要包装int ......:)

答案 1 :(得分:2)

您应该问自己的真正问题是,您是否需要将该成员与该课程分开分配。如果你只是将成员存储在类中通常会更好 - 与存储任何类型的指针相比。如果你不能这样做,如果成员的生命周期在创建容器之前或之后开始,可以扩展到成员的所有权之外可以屈服于其他对象,那么你必须使用指针。

一旦需要使用指针,您应该更喜欢指向原始指针的智能指针,并根据您的要求选择特定类型。如果成员所有权不与其他对象共享,但是您需要使用指针,因为所包含对象的生命周期可能在容器的生命周期之前或之后开始,或者如果所有权可以转移到其他对象,则管理资源(除非产生)是容器的唯一责任,然后更喜欢unique_ptrauto_ptr

如果包含的对象不属于此类,则使用shared_ptr。如果成员由不同的线程使用,也可以使用这个,即使所有权仅保留在其中一个线程中,每个线程都拥有自己的shared_ptr,以避免在一个线程中仍然销毁该对象在另一个人中使用。