[英]Should i use std::vector of std::unique_ptr<T[]> if memory is sparse and i'm not going to resize
[英]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個,具體取決於哪種情況最適合您:
在A
使用vector<vector<std::shared_ptr<B>>>
(使用通過std::make_shared
分配的類型填充它),並使C
的vector
為vector<std::shared_ptr<B>>
(如果從中刪除) A
不會影響C
並且不涉及引用循環)或vector<std::weak_ptr<B>>
(如果從A
刪除應刪除C
中的引用)
如果C
指向邏輯索引A
(其中改變所述值A
的vector
應該改變什么看透C
),變化C
持有:
一種。 對A
的vector
(或A
本身)的引用
灣 vector<std::pair<size_t, size_t>>
,其中每pair
定義用於在A
的vector
查找關聯值的索引。
選項2意味着A
根本不需要改變很多(除了確保C
可以看到其vector
); vector
保持基於值,因此在其中使用值僅保留兩個隨機訪問間接尋址,而不是使用shared_ptr
時所需的3-4個間接訪問( std::make_shared
表示有效為3,其中手動調用new
和std::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.