動態記憶體管理

配置的所有權(ownership)

當你在堆積上配置一塊區塊時,最終總得有人釋放它——剛好一次、在正確的時機。但區塊只是一個位址;記憶體本身並不帶任何標籤說明誰該負責。所有權是程式設計師之間約定的非正式概念,指的是哪段程式碼負責釋放某筆配置。C 完全不強制所有權;它是你記在腦中與註解裡的紀律。

把它想成一本圖書館的書。指標可以自由傳遞——許多函式都可能透過它讀寫——但其中剛好只有一個是擁有者,也就是在大家用完後有義務還書(釋放區塊)的那一個。借用指標是指使用它卻不承擔釋放的責任;移交所有權是指你把指標交出去,接收者現在欠下這次釋放,所以你自己不可再釋放它。錯誤源自分歧:若雙方都認為自己擁有某塊,它就會被釋放兩次(重複釋放);若雙方都認為對方擁有,它就永遠不會被釋放(洩漏);若一方釋放了而另一方仍持有指標,持有者現在就有了懸置指標。良好的 C 程式碼會把規則寫明,常見於函式名稱或註解裡:回傳新配置記憶體的函式會註明呼叫者現在擁有此物、請釋放它;只是借用的函式則會說明它不取得所有權。

這正是 Rust 語言把它變成編譯期規則的那個問題:在 Rust 中,所有權由編譯器追蹤,每個值有唯一的擁有者,當擁有者離開範圍時記憶體自動被釋放。在 C 中你擁有同樣的概念卻沒有任何強制——這就是為什麼一套清楚、寫明的所有權慣例,是 C 程式設計師能養成的最有價值的習慣之一。

/* 寫進簽章/註解的慣例: */ char *make_name(void); /* 回傳一個新區塊;呼叫者擁有並必須釋放它 */ void print_name(const char *name); /* 借用;不釋放 */

所有權是你記錄下來的慣例;C 不追蹤它。決定誰來釋放,並把它寫明。

C 中的所有權是非正式的——編譯器不檢查。單一區塊必須有唯一的擁有者;共享指標卻不約定由誰釋放,正是洩漏與重複釋放的由來。

又稱
who frees itresponsibility for freeing所有權