內存的三種分配方式:靜態存儲區分配,棧上分配,堆上分配。
內存使用常見錯誤:
(1)內存分配不成功,卻使用它。對策:使用前檢查內存是否為NULL。
(2)內存分配成功,但沒有初始化就使用它。對策:內存分配后初始化。
(3)內存分配成功且已經初始化,但是越界。對策:做越界檢查。
(4)忘記釋放內存,造成內存泄漏。對策:內存動態分配和釋放必須成雙配對。
(5)釋放了內存卻繼續使用它。
(a)對象關系過于復雜,理不清楚究竟釋放了沒有。
(b)return指向棧內存的指針或引用。
(c)free或delete內存后,沒有把指針置為NULL。導致野指針。
指針與數組。數組名對應著(而不是指向)一塊內存,在生存期內,其地址不可改變,只能是數組內容改變。
sizeof():
sizeof(數組)= 數組元素個數*sizeof(數組的元素數據類型)。
sizeof(指針)= 4;
數組作為參數傳遞時,數組名自動退化為指針類型,即sizeof(數組)=4;
sizeof(結構體或者類):這個有點麻煩,和編譯器的設置有關系,pragma pack(n)是編譯器指定的內存字節對齊方式,sizeof(結構或者類)和pragma pack(n)關系密切,默認的n=8,結構中的成員占用的內存起始地址為成員的數據類型的大小和n相比較的較小值。
指針參數:
不要讓指針參數在函數體內部申請內存,如果非要指針在函數體內部申請內存,就要用指針的指針。函數的返回值不能使用棧內分配的變量地址。
野指針:用malloc和new 分配了內存,就得用free和delete 釋放,否則造成內存泄漏,但是只釋放內存還是不夠安全的,必須在釋放內存后,讓指針指向NULL,才不至于造成野指針。我理解的野指針就是沒有正確指向的指針。