簡體   English   中英

對 unique_ptr 擁有 object 的唯一所有權意味着什么?

[英]What does it mean to have sole ownership of object for unique_ptr?

我知道當 object 只有一個所有者時使用std::unique_ptr ,當 object 有多個所有者時使用std::shared_ptr 成為 object 的唯一所有者意味着什么?

作為唯一的所有者是否意味着沒有其他人可以看到 object?

將指針作為引用傳遞時,我可以使用get()方法返回原始指針嗎?

我覺得如果我必須使用get() ,那么我要么使用std::move轉移所有權,要么使用共享指針。

所有權就是:當不再需要資源時,誰來清理它?

成為資源的唯一所有者意味着當不再需要 object 時,只有您負責刪除它。 這意味着在您的生命周期結束后,沒有其他人可以使用 object。 如果其他人依賴 object 在您的生命結束后仍然存在,您需要共享所有權。

在現代 C++ 中,原始指針不應參與所有權。 當您將原始指針傳遞給 function 時,您希望此 function 不會保留此指針以供以后使用。

所有權談論如何對 object 的生命周期負責。

假設您有一個 class shape ,您可以在該形狀上執行各種操作,例如計算表面積,放大或縮小 object,...

而這些任務由自由函數calculate_shape_areaenlarge_shapeshrink_shape ,您將形狀傳遞給 function,那么這些函數不需要擁有 object 的所有權,它們只需要知道 ZA8CFDE6331BD59EB261 的名稱即可。 因此,您可以(並且應該)將 object 作為原始指針傳遞:

struct shape {};

double calculate_shape_area(shape* obj) {
   // calculate the area, obj is only used within that function
   // and not stored anywhere else
}

int main() {
  auto obj = std::make_unique<shape>();
  auto area = calculate_shape_area(obj.get());
}

另一方面,如果您想使用insert將該形狀存儲在場景圖中,並且該場景圖在稍后的步驟中顯示所有形狀。 然后場景圖需要在調用insert之后知道 object,因此它要么需要創建它的副本,要么需要聲明對它的所有權。 如果您不想創建副本,那么您需要將unique_ptr移動到該insert或使用shared_ptr

每個 object“由”單個其他 object 管理的數據層次結構在邏輯上最容易遵循。 管理其他 object 的 object 是其他 object 的“所有者”。 結果數據將是樹狀的,沒有循環,沒有合並。 這就是為什么應該首選unique_ptr的原因。 哪些數據對程序的哪些部分可見是不同的問題。

但是,成為 object 的唯一所有者意味着什么呢?

所有權意味着對動態 object(或更一般地,資源)的生命周期負責:當所有者結束所擁有的 object 的生命周期時,它負責清理(釋放內存)。 此外,業主不必擔心 object 的使用壽命會因其他原因而結束。

唯一意味着沒有其他 object 可以共享所有權。

作為唯一所有者是否意味着沒有人可以看到 object?

不,封裝是一個正交概念。

暫無
暫無

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

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