---
# System prepended metadata

title: resource ownership/ ownership semantic 所有權

---

# resource ownership/ ownership semantic 所有權
create : 2024/12/04
update : 2024/12/16

類別圖主要考慮類別的設計，所有權主要考慮對資源的生命週期的管理

## 簡介
所有權語義是c\++的概念，不是c\++標準定義的。但c\++標準有提供一些符合此概念的工具。比如unique_ptr跟shared_ptr。

所有權主要考慮要不要管理他的生命週期

## 完整說明:
一個資源屬於誰
\= "一個資源的所有權屬於誰"
\= 一個資源的所有權屬於某個人/東西/個體(entity)
\= 一個個體持有/擁有一個資源
\= 重點 : **該個體負責管理該資源的生命週期**
\= 要確保當該資源不再被該所有權人需要時，正確的釋放資源以避免非預期問題的產生。

## 所有權人/個體
通常是指函數或物件。在多執行緒程式中會說哪個thread(的哪個函數或物件)。

## 物件
最常見的(資源的所有權人)是物件，擁有它資料成員的所有權。

### 函數 : [Modern C++ 参数传递：所有权语义](http://www.purecpp.cn/detail?id=2394)
仔細閱讀此文章。這裡提到的規則來自作者對C++ Core Guideline的整理
![image](https://hackmd.io/_uploads/H1QpmIpm1x.png)
1. Scoped ownership 作用域所有權
2. Borrowed ownership 借用所有權 : 暫時訪問該資源而不獲取他的所有權，通常透過raw指標跟引用實現。
3. Exclusive ownership 獨佔所有權 : 一個資源在任何時刻只能被一個實體擁有，所有權可轉移。
4. Shared ownership 共享所有權 
5. Weak ownership
有空看看 
資源的所有者、借用、獨佔者、共享者。
https://chatgpt.com/share/675007d9-8b08-800f-a082-53f90962b986

傳raw指標跟引用的區別在於raw指標很危險，他可能是
1. wild ptr (危險，func無法判斷它是否為wild ptr)
2. dangling ptr (危險，func無法判斷它是否為dangling ptr)
3. nullptr (要在func()內做判斷)

## 關鍵問題
到底誰是該資源的所有權人?
\= 到底是誰要負責該資源的生命週期

## 資源例子
最常見的資源是動態配置的記憶體，如果他的所有權人沒有正確釋放該資源，那可能會導致記憶體洩漏(比如一個物件在建構子(或他的方法中)用raw指標動態配置(new)一塊記憶體，但在該物件被銷毀後卻沒delete掉那塊記憶體)。

又或是一個物件正在使用/存取某個file或某塊共享記憶體(比如某個全域變數)，並且lock住(比如用mutex)不讓其他thread去存取，但它用完後卻沒釋放該lock。

常見的"資源": 動態配置的記憶體、多執行緒的lock、網路socket、file等等
from :  [The Gist of C++: Objects as Resource Owners | by Dagang Wei | Medium](https://medium.com/@weidagang/the-gist-of-c-objects-are-resource-owners-8ef7e02e4dc1)裡面的的 What Does “Resource Ownership” Mean?
資源:動態配置的記憶體、多執行緒的lock、網路socket、file等等

## semantic的意思
想想學程式語言時，老師教的syntax跟semantic的意思。