代码之家  ›  专栏  ›  技术社区  ›  Nathaniel G.M.

如何将现有对象推回到共享指针的向量上?

  •  0
  • Nathaniel G.M.  · 技术社区  · 6 年前

    使用原始指针,我可以创建指针的向量,并像这样向后推送地址:

    Entity objEntity;
    std::vector<Entity*> Entities;
    Entities.push_back(&objEntity);
    

    如果我使用共享指针的向量:

    std::vector<std::shared_ptr<Entity>> Entities;
    

    …我该怎么把地址推回?

    从我理解的,STD::SysDypPTR:::RESET用于将现有对象的地址分配给智能指针。我是否需要先创建一个临时指针,调用reset,然后再将\推回?

    std::shared_ptr<Entity> temp;
    temp.reset(&objEntity);
    Entities.push_back(temp);
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   VLL Mohamed El-Nakeep    6 年前

    你可以用 emplace_back 要构造新的共享指针:

    Entity* entity = new Entity;
    std::vector<std::shared_ptr<Entity>> Entities;
    Entities.emplace_back(entity);
    

    如果添加现有对象的地址,将尝试释放内存两次,因为共享指针的析构函数会破坏该对象:

    Entity entity;
    std::vector<std::shared_ptr<Entity>> Entities;
    Entities.emplace_back(&entity);
    // What happens when entity and shared pointer both go out of scope??
    

    为了避免这种情况,您要么需要用 new 或者在创建共享指针时进行复制。

        2
  •  6
  •   lubgr    6 年前

    在创建智能指针时,最好使用 std::make_* 功能。 vector::push_back 为右值引用重载,并像这样调用它

    Entities.push_back(std::make_shared<Entity>());
    

    因此,将通过移动 std::shared_ptr 您传入了,因此不会因为修改智能指针的控制块而影响性能。还要注意 vector::emplace_back 不能与一起使用 std::make_shared 但是只使用原始指针,为了异常处理和简洁(传递原始指针需要手动创建 Entity 堆上的实例)。