哪个非共享智能指针用于类成员变量

时间:2010-10-13 21:04:48

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

当我有一个包含指针作为成员变量的类时,如果我不想使用普通指针,它们应该具有哪种类型的智能指针?它们不需要共享(因此不需要shared_ptr)。 scoped_ptr将无法工作,因为我经常需要在初始化列表之外构建对象。

或者通常的做法是在创建过程中使用scoped_ptr时某些东西仍然可以失败(异常抛出等),然后将它们分配给普通指针?

3 个答案:

答案 0 :(得分:4)

如果您只是想在智能指针类型类中存储成员指针,那么您不会/不会忘记删除它们,那么标准选择将是auto_ptr。它位于STL中,当您需要释放分配给它的当前内存并将其替换为新对象时,可以使用reset()函数轻松“重置”它。

您仍然希望为具有auto_ptr成员的类实现自己的复制构造函数和赋值运算符。这是因为auto_ptrs赋值运算符转移了底层对象的所有权,因此默认赋值运算符将不具有您想要的效果。

以下是该课程的样子:

class X
{
public:
    X() :p(new ClassToManage) {}
    X(const X &copy)
        :p(new ClassToManage(*copy.p))
    {
    }

    X &operator=(const X &rhs)
    { 
        this->p.reset(new ClassToManage(*rhs.p));   
    }   

private:
    std::auto_ptr<ClassToManage> p;
};

对于所有其他情况,我建议boost::shared_ptr。 Shared_ptr确实可以进行引用计数,但您可以将它们存储在标准容器中,这使它们非常有用。

你应该最终试图摆​​脱使用普通指针来指向分配内存的任何东西,它负责删除。如果你想使用普通指针访问或迭代普通的ole数组等,那就没关系(但问问自​​己为什么你没有使用std :: vector),但是当你用它们指向某个东西时它负责释放然后你要求麻烦。编写代码时我的目标是没有明确的删除。

答案 1 :(得分:1)

您可以使用TR1之前可用的std::auto_ptr,因此您的代码不依赖于支持TR1-smartpointers的编译器。

答案 2 :(得分:0)

通常我使用deep_copy_ptr。现在我知道loki smart_ptr和axter智能指针这样做。它允许自动复制指针类,就像它是一个普通的成员变量一样(你不需要定义一个特殊的赋值运算符/复制构造函数)。

我认为您不必在初始化列表中专门初始化它(但是像普通指针一样,如果它没有有效值,请不要使用它,显然)。