1

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

或者,当某些事情仍然可能失败(抛出异常等)时,在创建过程中使用 scoped_ptr 并随后将它们分配给普通指针是否可能是一种常见的做法?

4

3 回答 3

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

于 2010-10-13T21:07:21.107 回答
1

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

于 2010-10-14T07:20:52.347 回答
0

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

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

于 2010-10-13T23:51:08.320 回答