【问题标题】:Which non-shared Smart Pointer for class member variables类成员变量的非共享智能指针
【发布时间】:2010-10-13 21:04:47
【问题描述】:

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

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

【问题讨论】:

  • 你能举个更具体的例子吗?
  • @Benjamin:为什么不让ObjectB 成为非指针成员?
  • boost::optional 可能更合适。听起来您需要的不是“指向动态分配对象的指针”,而是一种指定对象可能已创建或尚未创建的方法。
  • @Benjamin(对不起,我在您回复之前删除了该评论,我认为这无关紧要):我不明白为什么。您的整个应用程序不必在单个全局大师班内。你可以上不止一堂课。 ;)
  • 不,一切都很好。这确实是我设计中的一个缺陷。非常感谢您带领我走上正确的道路:)

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


【解决方案1】:

如果您只想将成员指针存储在智能指针类型类中,这样您就不会/不会忘记删除它们,那么标准选择是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),但是当您使用它们指向的东西时它负责释放然后你在自找麻烦。我在编写代码时的目标是没有显式删除。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 2015-06-12
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 2014-01-24
        相关资源
        最近更新 更多