十三誡增修--06:你不可以只做 malloc(), 而不做相應的 free().

看板C_and_CPP作者 (沒有存在感的人)時間9年前發表 (2016/05/20 14:23), 9年前編輯推噓5(5021)
留言26則, 5人參與, 最新討論串1/1
誡6加了unique_ptr的部份,我不是很熟,若是有誤請指正。 =============================================================== 06. [C]你不可以只做 malloc(), 而不做相應的 free(). 否則會造成記憶體漏失 但若不是用 malloc() 所得到的記憶體,則不可以 free()。已經 free()了 所指記憶體的指標,在它指向另一塊有效的動態分配得來的空間之前,不可 以再被 free(),也不可以提取(dereference)這個指標。 小技巧: 可在 free 之後將指標指到 NULL,free不會對空指標作用。 例: int *p = malloc(sizeof(int)); free(p); p = NULL; free(p); // free不會對空指標有作用 ===================================================================== [C++] 你不可以只做 new, 而不做相應的 delete (除了unique_ptr以外) 註:new 與 delete 對應,new[] 與 delete[] 對應, 不可與malloc/free混用(結果不可預測) 切記,做了幾次 new,就必須做幾次 delete 小技巧: 可在 delete 之後將指標指到0或nullptr(C++11開始), 由於 delete 本身會先做檢查,因此可以避免掉多次 delete 的錯誤 正確例子: int *ptr = new int(99); delete ptr; ptr = nullptr; delete ptr; /* delete 只會處理指向非 NULL 的指標 */ 備註: C++11後新增智能指標(smart pointer): unique_ptr 當unique_ptr所指物件消失時,會自動釋放其記憶體,不需要delete。 例: #include <memory> // 含unique_ptr的標頭檔 std::unique_ptr<int> p1(new int(5)); 補充資料: http://en.cppreference.com/w/cpp/memory/unique_ptr -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.52.193 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1463754219.A.14D.html ※ 編輯: wtchen (223.140.52.193), 05/20/2016 22:24:15 ※ 編輯: wtchen (223.140.52.193), 05/20/2016 22:25:05

05/20 22:34, , 1F
unique_ptr<int[]> 可以用在 new int[100]
05/20 22:34, 1F

05/20 22:34, , 2F
C++11 以前似乎不行
05/20 22:34, 2F

05/20 22:37, , 3F
我印象中unique_ptr是C++11開始才有的,之前只有auto_ptr
05/20 22:37, 3F

05/20 22:37, , 4F
auto_ptr在C++11似乎拿掉了?
05/20 22:37, 4F

05/20 22:47, , 5F
auto_ptr 變成 deprecate 了
05/20 22:47, 5F

05/20 22:48, , 6F
auto_ptr 當 parameter,函數結束的時候就 free 掉了
05/20 22:48, 6F

05/20 23:01, , 7F
用unique_ptr<int[]>還不如用vector<int>
05/20 23:01, 7F

05/20 23:16, , 8F
我其實不是很懂unique_ptr的使用時機...
05/20 23:16, 8F

05/20 23:36, , 9F
Smart Pointers (Modern C++) https://goo.gl/rCUn9K
05/20 23:36, 9F

05/20 23:37, , 10F
unique_ptr, shared_ptr, weak_ptr 都有其使用時機
05/20 23:37, 10F

05/20 23:42, , 11F
如果今天只是要配置一個陣列,而沒有要將其元素初始化
05/20 23:42, 11F

05/20 23:44, , 12F
使用 unique_ptr 搭配 custom deleter,就可以使用
05/20 23:44, 12F

05/20 23:45, , 13F
malloc 跟 free 來配置一塊記憶體給 unique_ptr
05/20 23:45, 13F

05/20 23:54, , 14F
在數量級很大時,配置的記憶體能被自動回收又兼顧速度
05/20 23:54, 14F

05/21 00:01, , 15F
更常被用的是,像 file descriptor 或 socket FD 之類
05/21 00:01, 15F

05/21 00:02, , 16F
在 custom deleter 帶自己想要的回收函式做一些事情
05/21 00:02, 16F

05/21 00:22, , 17F
第一個例子不好,因為 built-in type 也可省略初始化
05/21 00:22, 17F

05/21 00:22, , 18F
不一定要用 malloc 跟 free 還有 customer deleter
05/21 00:22, 18F

05/21 00:23, , 19F
像是 std::vector<int> 就無法省下初始化的動作了
05/21 00:23, 19F

05/21 00:28, , 20F
假設我想要當成一塊 buffer 去給別人來填資料 XD
05/21 00:28, 20F

05/21 00:30, , 21F
而 3rd-party library 又只吃 int * 的場合之類的
05/21 00:30, 21F

05/21 10:36, , 22F
動態陣列我建議用STL的容器 像vector之類的來做就好了
05/21 10:36, 22F

05/21 10:37, , 23F
effective STL有教你可以用vector 去填C風格的function
05/21 10:37, 23F

05/21 10:38, , 24F
只是你要知道裡面會不會 重新allocate記憶體
05/21 10:38, 24F

05/21 10:39, , 25F
如果不會你就可以用 像是&v[0] 的方式 去填原來 pointer
05/21 10:39, 25F

05/21 10:39, , 26F
的參數
05/21 10:39, 26F
文章代碼(AID): #1NFnth5D (C_and_CPP)