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

Cas*_*sey 18 c++ auto-ptr shared-ptr weak-ptr unique-ptr

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

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

  • 原始指针:只有当你真的,真的,真的,真的,知道你正在做什么并且在界面后面仔细隐藏用法时才使用.
  • std :: auto_ptr:过时从不使用.
  • std :: unique_ptr:在赋值时转移所有权的Singleton指针.
  • 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;
//...
};
Run Code Online (Sandbox Code Playgroud)

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

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

- 编辑 -

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

Pup*_*ppy 5

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

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

  • @Casey:这只适用于可破坏的资源.原始指针仍然是必不可少的*观察者*,就像引用一样. (5认同)
  • @ VF1您无法重新定位参考.如果观察者可以使用引用无效,则无法正常工作. (2认同)