std :: unique_ptr vs std :: shared_ptr vs std :: weak_ptr vs std :: auto_ptr vs raw pointer

时间:2013-08-16 02:00:16

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

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

我的理解很少,但我可以从中收集:

  • 原始指针:只有在您真正,真实,真实,真实地知道自己在做什么并且在界面后面仔细隐藏用途时才使用。
  • std :: auto_ptr:过时从不使用。
  • std :: unique_ptr:在分配时转移所有权的单一指针。
  • std :: shared_ptr:引用已计数的指针,该指针在分配时不会转移所有权,但会增加其引用计数。当所有引用都离开作用域或明确std::shared_ptr::reset时,将调用基础deallocator
  • std :: weak_ptr:子类型std::shared_ptr,它不会增加引用计数,并且在其父std::shared_ptr不再存在时无效。可能会返回无效的引用。使用前请务必检查。

RAW POINTER等效示例

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

拥有所有权转让的单身人士:

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

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

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

- 编辑 -

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

1 个答案:

答案 0 :(得分:5)

  

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

它们中的每一个,最终都涉及摧毁指向的资源。换句话说,几乎所有这些。我可以想到没有涉及原始指针的成语,这些指针不涉及破坏指向资源。其他每一种用法都不是一种习惯用语,它只是“使用指针”。