C++經典面試之 記憶體分配的三種方式
阿新 • • 發佈:2019-01-29
把所有的點都說到,才能說明你有足夠的專案經驗,在實際工作的時候不會因為一些小問題而產生一些嚴重的bug,也證明了你有實力勝任這份工作。
要回答這個問題,我們必須先要理解C++的記憶體管理方式,需要站在記憶體四區的角度去審視一下程式碼,這樣整個理解了記憶體分配的方式,回答的時候就只需要注意一些細節了。寫一個例子然後畫一下記憶體示意圖。
int getmem(char **myp,int length) { if(myp==NULL) { return -1; } char *tmp=(char *)malloc(sizeof(char)*length); if(tmp==NULL) { return -2; } memset(tmp,0,length); /* memset(tmp,0,sizeof(tmp)//隨手就寫的,sizeof(tmp)是指標的大小,4個位元組 */ memcpy(tmp,"hello...",length); *myp=tmp; } int main() { int a=10,*p1=NULL; char *p=NULL,*mystr="hello world"; getmem(&p,10); printf("%s",p); free(p); p=NULL; system("pause"); return 0; }
上面程式碼的記憶體四區示意圖:
理解之後就可以回答問題了:1、在棧上分配記憶體:函式中的臨時區域性變數分配在棧上,由作業系統自動分配,函式呼叫結束時記憶體也隨之析構,棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。2、在靜態儲存區分配記憶體,這塊記憶體在程式編譯的時候就已經分配好,用來存放常量,全域性變數和static變數,記憶體在整個程式執行週期內都存在。3、在堆區使用malloc或new申請記憶體,這種記憶體分配方式非常靈活,需要注意
①申請記憶體後立即判斷指標是否為NULL確定記憶體是否分配成功,如果為NULL則立即用return終止此函式,或者用exit(1)終止整個程式的執行,為new和malloc設定異常處理函式;
②為申請的記憶體賦初值,分配的是一段連續的記憶體空間的話,要防止指標下標越界;
③sizeof是操作符,不能用sizeof得到記憶體空間的大小,只能在申請時候記住申請的空間大小;
④在記憶體使用結束後必須用free或delete釋放記憶體,注意在記憶體使用中如果存在指標加1或減1 的操作應特別注意,釋放的記憶體要和申請的記憶體一致,放置記憶體洩漏,釋放記憶體後,應該立即將指標置為NULL,不要存在野指標。