2010-10-13 100 views
1

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

或者在创建过程中,当某些东西仍然可能失败(抛出异常等)并且之后将它们分配给普通指针时,可能会使用scoped_ptr?

+0

你能举一个更具体的例子吗? – GManNickG 2010-10-13 21:07:09

+0

简单组成:对象A包含对象B.对象A创建并销毁B.没有其他对象可以影响B的生存期。 – tyrondis 2010-10-13 21:14:16

+2

@Benjamin:为什么不让'ObjectB'成为非指针成员? – GManNickG 2010-10-13 21:15:03

回答

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),但是当你使用它们指向一些它负责释放,然后你要求麻烦。编写代码时我的目标是没有明确的删除。

+0

感谢RC!好的方法将牢记在心! – tyrondis 2010-10-13 22:10:18

0

通常我使用deep_copy_ptr。现在我知道Loki smart_ptr和axter智能指针可以做到这一点。它允许指针类自动复制,就像它是一个普通的成员变量一样(不需要定义特殊的赋值操作符/拷贝构造函数)。我认为你不必在初始化列表中明确地初始化它(但是像一个普通的指针,显然,如果它没有一个有效的值,不要使用它)。

1

您可以使用std::auto_ptr,它可以在TR1之前提供,因此您的代码不依赖于支持TR1智能指针的编译器。