c++ - 在容器中使用智能指针的原因

标签 c++ c++11 containers smart-pointers

简单写我想问“使用智能指针的充分理由是什么?”
为前 std::unique_ptr
但是,我并不是在询问使用智能指针而不是常规(哑)指针的理由。我想每个人都知道,或者快速搜索可以找到原因。

我要问的是这两种情况的比较:

给定一个名为 MyObject 的类(或结构)用

  • std:queue<std::unique_ptr<MyObject>>queue;

  • 而不是
  • std:queue<MyObject> queue;

  • (可以是任何容器,不一定是队列)

    为什么有人应该使用选项 1 而不是选项 2?

    最佳答案

    这其实是个好问题。

    我能想到的原因有几个:

  • 多态仅适用于引用和指针,不适用于值类型。所以如果你想在容器中保存派生对象,你不能有 std::queue<MyObject> .一种选择是 unique_ptr ,另一个是reference_wrapper
  • 从容器外部引用 (*) 包含的对象。根据容器的不同,它所持有的元素可以移动,从而使之前对它的引用无效。例如 std::vector::insert或容器本身的移动。在这种情况下 std::unique_ptr<MyObject>确保引用是有效的,无论容器用它做什么(ofc,只要 unique_ptr 还活着)。
    在以下示例中 Objects您可以在队列中添加一堆对象。但是,其中两个对象可能很特殊,您可以随时访问这两个对象。
    struct MyObject { MyObject(int); };
    
    struct Objects
    {
        std::queue<std::unique_ptr<MyObject>> all_objects_;
    
        MyObject* special_object_ = nullptr;
        MyObject* secondary_special_object_ = nullptr;
    
        void AddObject(int i)
        {
            all_objects_.emplace(std::make_unique<MyObject>(i));
        }
    
        void AddSpecialObject(int i)
        {
            auto& emplaced = all_objects_.emplace(std::make_unique<MyObject>(i));
            special_object_ = emplaced.get();
        }
    
        void AddSecondarySpecialObject(int i)
        {
            auto& emplaced = all_objects_.emplace(std::make_unique<MyObject>(i));
            secondary_special_object_ = emplaced.get();
        }
    };
    

  • (*) 我在这里使用具有英文含义的“引用”,而不是 C++ 类型。任何引用对象的方式(例如,通过原始指针)

    关于c++ - 在容器中使用智能指针的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61727550/

    相关文章:

    c++ - 拥有 std::map 的最佳方法,如果没有 key ,我可以在其中定义返回的内容?

    c++:查找程序中的最大容器

    c++ - OpengL 段错误

    c++ - 在C或C++中有没有函数实现reverse memmem?

    c++ - 巨大的初始化列表,如何修复 "fatal error C1060: compiler is out of heap space"

    c++ - 如何有效地使用 std::threads 来减少运行时间

    c++ - 在 C++11 中实现递归代理模式

    security - OpenShift 是否通过在主机级别隔离容器来支持真正的 Multi-Tenancy ?

    C++:任意模板类型的容器

    c++ - Qt5 有没有办法让 QLocalServer 监听抽象的 unix 套接字?