c++ - 哪些是类成员变量的非共享智能指针

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

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

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

最佳答案

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

关于c++ - 哪些是类成员变量的非共享智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927992/

相关文章:

c++ - Qt:QGraphicsLineItem在QGraphicsScene中的位置

c++ - 客户端和服务器之间的通信不稳定

c++ - 如何使用 for-each 循环来美化析构函数?

c++ - 如何更改指针的 cout 格式

c++ - 共享指针和性能

c++ - std::shared_ptr _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 改变指针时

c++ - 将对象(而不是指针)向下转换为它们已知的派生类型是否安全?

c++ - 如何确保从函数返回指针是安全的

c - 如何访问 C 结构体中的指针成员?

c++ - 私有(private)构造函数和 make_shared