c++ - std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针

标签 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 指针等价示例

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

所有权转让的单例:

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

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

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

--编辑--

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

最佳答案

what idiom is each smart pointer supposed to replace?

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

关于c++ - std::unique_ptr vs std::shared_ptr vs std::weak_ptr vs std::auto_ptr vs 原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264673/

相关文章:

c++ - 取消对 unique_ptr 的引用

c++ - 如何从多个继承的类对象中分配 unique_ptr<base>?

c++ - 将 makefile 与 boost 线程一起使用时遇到问题

c++ - C++ 编译器中存在哪些不常见的浮点大小?

c++ - 取消引用共享指针并分配给它

c++ - 错误 : no matching member function for call to 'reset' (shared pointers)

c++ - 为什么我不能将 unique_ptr 与函数返回的 unique_ptr 交换?

C++ 链表指针指向结构崩溃

c++ - 为什么 QList 没有 resize() 方法?

c++ - 通过引用为 boost::shared_ptr 创建别名