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