十三誡增修--06:你不可以只做 malloc(), 而不做相應的 free().
誡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
05/20 22:34, 1F
→
05/20 22:34, , 2F
05/20 22:34, 2F
→
05/20 22:37, , 3F
05/20 22:37, 3F
→
05/20 22:37, , 4F
05/20 22:37, 4F
推
05/20 22:47, , 5F
05/20 22:47, 5F
→
05/20 22:48, , 6F
05/20 22:48, 6F
推
05/20 23:01, , 7F
05/20 23:01, 7F
→
05/20 23:16, , 8F
05/20 23:16, 8F
推
05/20 23:36, , 9F
05/20 23:36, 9F
→
05/20 23:37, , 10F
05/20 23:37, 10F
→
05/20 23:42, , 11F
05/20 23:42, 11F
→
05/20 23:44, , 12F
05/20 23:44, 12F
→
05/20 23:45, , 13F
05/20 23:45, 13F
→
05/20 23:54, , 14F
05/20 23:54, 14F
→
05/21 00:01, , 15F
05/21 00:01, 15F
→
05/21 00:02, , 16F
05/21 00:02, 16F
推
05/21 00:22, , 17F
05/21 00:22, 17F
→
05/21 00:22, , 18F
05/21 00:22, 18F
→
05/21 00:23, , 19F
05/21 00:23, 19F
→
05/21 00:28, , 20F
05/21 00:28, 20F
→
05/21 00:30, , 21F
05/21 00:30, 21F
→
05/21 10:36, , 22F
05/21 10:36, 22F
→
05/21 10:37, , 23F
05/21 10:37, 23F
→
05/21 10:38, , 24F
05/21 10:38, 24F
→
05/21 10:39, , 25F
05/21 10:39, 25F
→
05/21 10:39, , 26F
05/21 10:39, 26F