簡體   English   中英

c ++ 11新功能,正確使用shared_ptr?

[英]New to c++11 features, proper use of shared_ptr?

所以我的理解是,當對象的最后一個剩余所有者被銷毀或重新分配時,shared_ptr會自動從內存中釋放出來(看起來太好了?)當許多實例可能共享同一個對象時它很有用。 正確?

所以在我的情況下,我正在制作一個2d平鋪世界,所以我在屏幕上繪制了許多相同的紋理。

我有

std::map<int, shared_ptr<Tile>> Tiledb;

存儲所有瓷磚。 我的想法是只加載一次紋理,然后我可以根據需要多次渲染它。 一旦游戲結束,我就打電話

Tiledb.clear();

這會自動釋放所有內存嗎? 我很習慣於常規指針,這看起來很神奇,坦率地說,太容易了。 我認為它是如何工作的我錯了嗎? 使用shared_ptrs有什么缺點嗎? 哈哈,我感到很驚訝。

感謝您提供任何信息。

...當許多實例可能共享同一個對象時,它很有用。 正確?

不完全是。 當許多實例可能擁有相同的對象時,它很有用。 共享不足以證明使用std::shared_ptr是合理的,因為使用它肯定會有一些開銷。

當您創建動態資源時,您需要考慮所有權,即。 誰負責刪除它 應該負責刪除資源的對象應該使用某種智能指針 (或容器 )來管理資源。

如果只有一個對象負責決定何時必須刪除資源,則使用std::unique_ptr 如果其他對象/函數需要共享對資源的訪問權限,但永遠不負責刪除它,那么將它們傳遞給資源的引用原始指針

使用std::shared_ptr的時間是當您無法知道共享資源的哪些對象將是需要刪除它的對象時。 在這種情況下,每個對象應該通過持有std::shared_ptr 擁有資源的所有權

即使多個對象通過std::shared_ptr共享所有權 ,它們仍應僅將引用原始指針傳遞給不需要所有權的對象/函數。

傳遞std::stared_ptr willy-nilly(不需要它們)的另一個問題是它們可能遭受Java內存泄漏問題。 這就是對象永遠不會死的原因,因為對它們的一些引用仍然存在於軟件中被遺忘的部分。 他們可以逐漸積累並消耗你的記憶。

通常,您應該更喜歡將資源保存在像std::vectorstd::map這樣的容器中

std::map<int, Tile> Tiledb;

容器管理Tile的破壞,因此不需要智能指針

但是,如果您使用的是多態 Tile對象,則需要使用指針存儲它們。 為此,我更喜歡使用std::unique_ptr

// When the Tiles are no longer needed after the map is destroyed
std::map<int, std::unique_ptr<Tile>> Tiledb;

如果其他對象需要在銷毀地圖 繼續訪問Tile對象那么std::shared_ptr可能是合適的:

// only when Tiles need to keep living after the map is destroyed.
std::map<int, std::shared_ptr<Tile>> Tiledb; 

絕對。
類類型具有構造函數和析構函數。
它們在實例化期間和變量生命周期結束時被隱式調用。

這個概念被稱為RAII ,它的智能指針用於自動內存管理。

這取決於您的用例,但您也可以考慮使用唯一指針:

#include <iostream>
#include <memory>
#include <map>

struct Foo{

  Foo(){
    std::cout << "construct\n";
  }

  ~Foo(){
    std::cout << "destruct\n";
  }
};

int main(){
  std::map<int, std::unique_ptr<Foo>> m;

  //prints construct 3 times
  m.emplace(1,std::make_unique<Foo>());
  m.emplace(2,std::make_unique<Foo>());
  m.emplace(3,std::make_unique<Foo>());

  //prints destruct 3 times
  m.clear();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM