当我有一个包含指针作为成员变量的类时,如果我不想使用普通指针,它们应该具有哪种类型的智能指针?它们不需要共享(因此不需要shared_ptr)。 scoped_ptr将无法工作,因为我经常需要在初始化列表之外构建对象。
或者通常的做法是在创建过程中使用scoped_ptr时某些东西仍然可以失败(异常抛出等),然后将它们分配给普通指针?
答案 0 :(得分:4)
如果您只是想在智能指针类型类中存储成员指针,那么您不会/不会忘记删除它们,那么标准选择将是auto_ptr
。它位于STL中,当您需要释放分配给它的当前内存并将其替换为新对象时,可以使用reset()
函数轻松“重置”它。
您仍然希望为具有auto_ptr成员的类实现自己的复制构造函数和赋值运算符。这是因为auto_ptrs赋值运算符转移了底层对象的所有权,因此默认赋值运算符将不具有您想要的效果。
以下是该课程的样子:
class X
{
public:
X() :p(new ClassToManage) {}
X(const X ©)
: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智能指针这样做。它允许自动复制指针类,就像它是一个普通的成员变量一样(你不需要定义一个特殊的赋值运算符/复制构造函数)。
我认为您不必在初始化列表中专门初始化它(但是像普通指针一样,如果它没有有效值,请不要使用它,显然)。