[英]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_area
、 enlarge_shape
、 shrink_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.