![](/img/trans.png)
[英]No matching member function call to 'push_back', vector of shared pointers
[英]How to push_back existing objects to a vector of shared pointers?
使用原始指針,我可以創建指針和push_back地址的向量,如下所示:
Entity objEntity;
std::vector<Entity*> Entities;
Entities.push_back(&objEntity);
如果我改用共享指針的向量:
std::vector<std::shared_ptr<Entity>> Entities;
...我如何push_back地址?
據我了解,std :: shared_ptr :: reset用於將現有對象的地址分配給智能指針。 我是否需要首先創建一個臨時指針,調用reset,然后push_back?
std::shared_ptr<Entity> temp;
temp.reset(&objEntity);
Entities.push_back(temp);
創建智能指針時,最好使用其std::make_*
函數。 vector::push_back
重載了右值引用,像這樣調用它
Entities.push_back(std::make_shared<Entity>());
因此將通過移動傳入的std::shared_ptr
在向量中構造一個元素,因此,由於在此處修改了智能指針的控制塊,因此不會對性能造成任何影響。 還請注意, vector::emplace_back
不能與std::make_shared
一起使用,而只能與原始指針一起使用,為避免異常處理和簡潔起見,應避免使用它(通過傳遞原始指針需要在上手動創建Entity
實例堆)。
您可以使用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
構造對象,或者在創建共享指針時進行復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.