簡體   English   中英

如果我不嘗試管理指向的對象的內存,是否應該使用unique_ptr?

[英]Should I be using unique_ptr if I'm not trying to manage the memory of the object I'm pointing at?

我有三堂課:A,B,C

在類A中有一個vector<vector<B>>

在C類中有一個vector<unique_ptr<B>> ,C向量中的ptrs僅指向A類中2d向量的元素。

我只想引用這些元素,而又不想用這些指針創建新的內存(不知道那是unique_ptrs在做什么)。

在這種情況下,僅使用原始指針會更好嗎?

編輯:我不希望指向的對象在刪除矢量時被刪除(當ptrs超出范圍時)

您不能(除非您喜歡破壞所有事物,否則不應該)使用unique_ptr來指代未通過new (或通過std::make_unique隱式分配)的對象。

除非您在初始化C之前完全初始化A的2D vector ,然后再不調整其大小,否則使用原始指針並不是一個特別好的主意。 調整大小會使指針無效,如果嘗試從指針讀取指針,則會導致未定義的行為。

我建議使用2個選項中的1個,具體取決於哪種情況最適合您:

  1. A使用vector<vector<std::shared_ptr<B>>> (使用通過std::make_shared分配的類型填充它),並使Cvectorvector<std::shared_ptr<B>> (如果從中刪除) A不會影響C並且不涉及引用循環)或vector<std::weak_ptr<B>> (如果從A刪除應刪除C中的引用)

  2. 如果C指向邏輯索引A (其中改變所述值Avector應該改變什么看透C ),變化C持有:

    一種。 Avector (或A本身)的引用

    vector<std::pair<size_t, size_t>> ,其中每pair定義用於在Avector查找關聯值的索引。

選項2意味着A根本不需要改變很多(除了確保C可以看到其vector ); vector保持基於值,因此在其中使用值僅保留兩個隨機訪問間接尋址,而不是使用shared_ptr時所需的3-4個間接訪問( std::make_shared表示有效為3,其中手動調用newstd::shared_ptr為4) 。

B對象的生存期由A的向量管理。 這意味着無需在它們周圍包裝unique_ptr 實際上,如果沒有使用no-op刪除器創建unique_ptr ,那就是一個錯誤; 在這種情況下,它們將刪除對象,然后矢量將再次刪除它們。

由於C僅需要觀察對象,因此可以使用原始指針。 非擁有原始指針(意味着您永遠不會調用delete指針)就可以了。

但是,這種長期的原始指針可能很難推理。 指向的對象仍然有效嗎? 你怎么知道的? 您可能想改為向A添加一個API,該API提供對對象的訪問權限,並且僅在需要時才在C訪問它們,而不存儲指向它們的任何指針。

暫無
暫無

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

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