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

作者: wtchen (沒有存在感的人)   2016-05-20 22:23:36
誡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
作者: johnjohnlin (嗯?)   2016-05-20 22:34:00
unique_ptr<int[]> 可以用在 new int[100]C++11 以前似乎不行
作者: wtchen (沒有存在感的人)   2016-05-20 22:37:00
我印象中unique_ptr是C++11開始才有的,之前只有auto_ptrauto_ptr在C++11似乎拿掉了?
作者: johnjohnlin (嗯?)   2016-05-20 22:47:00
auto_ptr 變成 deprecate 了auto_ptr 當 parameter,函數結束的時候就 free 掉了
作者: kwpn (ITSST)   2016-05-20 23:01:00
用unique_ptr<int[]>還不如用vector<int>
作者: wtchen (沒有存在感的人)   2016-05-20 23:16:00
我其實不是很懂unique_ptr的使用時機...
作者: LiloHuang (十年一刻)   2016-05-20 23:36:00
Smart Pointers (Modern C++) https://goo.gl/rCUn9Kunique_ptr, shared_ptr, weak_ptr 都有其使用時機如果今天只是要配置一個陣列,而沒有要將其元素初始化使用 unique_ptr 搭配 custom deleter,就可以使用malloc 跟 free 來配置一塊記憶體給 unique_ptr在數量級很大時,配置的記憶體能被自動回收又兼顧速度更常被用的是,像 file descriptor 或 socket FD 之類在 custom deleter 帶自己想要的回收函式做一些事情第一個例子不好,因為 built-in type 也可省略初始化不一定要用 malloc 跟 free 還有 customer deleter像是 std::vector<int> 就無法省下初始化的動作了假設我想要當成一塊 buffer 去給別人來填資料 XD而 3rd-party library 又只吃 int * 的場合之類的
作者: Clangpp (Clang++)   2016-05-21 10:36:00
動態陣列我建議用STL的容器 像vector之類的來做就好了effective STL有教你可以用vector 去填C風格的function只是你要知道裡面會不會 重新allocate記憶體如果不會你就可以用 像是&v[0] 的方式 去填原來 pointer的參數

Links booklink

Contact Us: admin [ a t ] ucptt.com