【问题标题】:std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs raw pointersstd::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针
【发布时间】:2013-08-18 08:24:00
【问题描述】:

与使用原始指针的类似(但不限于)一些高级技术相比,每个智能指针的等效用途是什么?

我的理解很少,但从我能收集到的情况来看:

  • 原始指针:只有在你真的、真的、真的、真的知道你在做什么并且小心地隐藏在界面后面的用法时才使用。
  • std::auto_ptr:已过时永不使用。
  • std::unique_ptr: 在赋值时转移所有权的单例指针。
  • std::shared_ptr: 引用计数指针,在分配时不会转移所有权,但会增加其引用计数。当所有引用离开作用域或显式为std::shared_ptr::reset 时,将调用底层deallocator
  • std::weak_ptr: 子类型std::shared_ptr 不会增加引用计数,并且在其父std::shared_ptr 不再存在时失效。可能返回和无效引用。使用前务必检查。

RAW 指针等价示例

引用计数、缓存实现: std::map<std::string, std::pair<long, BITMAP*> > _cache;

所有权转让的单身人士:

class Keyboard {
public:
//...
    static Keyboard* CreateKeyboard();
    ~Keyboard();
//...
private:
//...
    Keyboard();
    static Keyboard* _instance;
//...
};

聚合容器,无所有权:空间分区图和树,迭代容器等。

复合容器,所有权:大型对象。

--编辑--

在我工作的过程中,我遇到了一个有趣的案例,DeadMG 指出智能指针应该被用作简单的抽象来处理资源管理;不能在声明时在堆上创建但必须在以后创建的文件范围对象呢?

【问题讨论】:

  • 我不明白你在问什么。如何使用原始指针实现智能指针行为?
  • 我不知道这个问题是什么,但如果你调用unique_ptr 一个单例指针,我怀疑你在这里对单例有完全不同的含义。
  • @Casey:您可能需要考虑将其编辑到您的问题中。
  • @Casey:不,每个资源只有一个 unique_ptr。如果您开始使用自定义删除器来做一些事情而不是完全破坏资源,那么即使这样也可能有点灵活。
  • @DeadMG Ohhh,所以这是一对一的关系,而不是std::shared_ptrs 一对多。

标签: c++ shared-ptr unique-ptr auto-ptr weak-ptr


【解决方案1】:

每个智能指针应该替换什么成语?

它们中的每一个最终都涉及破坏指向的资源。换句话说,几乎所有这些。我想不出任何涉及不涉及破坏指向资源的原始指针的习语。其他所有用法都不是真正的成语,它只是“使用指针”。

【讨论】:

  • 聚合容器不会破坏它们指向的资源,它们只是将它们从列表中删除。这是我在研究智能指针时最关心的一个问题,哪种智能指针可能适合这种用法?
  • @Casey:如果他们不销毁他们指向的资源,他们为什么要使用智能指针?智能指针用于破坏事物。
  • 好吧,这就是我感到困惑的原因。我读过的每个提倡智能指针的人都强烈反对以任何形式或方式使用原始指针,应该用智能指针代替。
  • @Casey:这仅适用于可销毁的资源。原始指针仍然是必不可少的观察者,就像引用一样。
  • @VF1 您无法重新安装参考。如果观察者可以为空,那么使用引用是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2021-05-26
  • 2019-10-11
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
相关资源
最近更新 更多