C 經典面試之 記憶體分配的三種方式

2021-08-20 00:18:27 字數 1113 閱讀 5117

把所有的點都說到,才能說明你有足夠的專案經驗,在實際工作的時候不會因為一些小問題而產生一些嚴重的bug,也證明了你有實力勝任這份工作。

要回答這個問題,我們必須先要理解c++的記憶體管理方式,需要站在記憶體四區的角度去審視一下**,這樣整個理解了記憶體分配的方式,回答的時候就只需要注意一些細節了。寫乙個例子然後畫一下記憶體示意圖。

int getmem(char **myp,int length)

char *tmp=(char *)malloc(sizeof(char)*length);

if(tmp==null)

memset(tmp,0,length);

/* memset(tmp,0,sizeof(tmp)//隨手就寫的,sizeof(tmp)是指標的大小,4個位元組

*/ memcpy(tmp,"hello...",length);

*myp=tmp;

}int main()

上面**的記憶體四區示意圖:

理解之後就可以回答問題了:1、在棧上分配記憶體:函式中的臨時區域性變數分配在棧上,由作業系統自動分配,函式呼叫結束時記憶體也隨之析構,棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。2、在靜態儲存區分配記憶體,這塊內存在程式編譯的時候就已經分配好,用來存放常量,全域性變數和static變數,內存在整個程式執行週期內都存在。3、在堆區使用malloc或new申請記憶體,這種記憶體分配方式非常靈活,需要注意

①申請記憶體後立即判斷指標是否為null確定記憶體是否分配成功,如果為null則立即用return終止此函式,或者用exit(1)終止整個程式的執行,為new和malloc設定異常處理函式;

②為申請的記憶體賦初值,分配的是一段連續的記憶體空間的話,要防止指標下標越界;

③sizeof是操作符,不能用sizeof得到記憶體空間的大小,只能在申請時候記住申請的空間大小;

④在記憶體使用結束後必須用free或delete釋放記憶體,注意在記憶體使用中如果存在指標加1或減1 的操作應特別注意,釋放的記憶體要和申請的記憶體一致,放置記憶體洩漏,釋放記憶體後,應該立即將指標置為null,不要存在野指標。

記憶體分配的三種方式

把所有的點都說到,才能說明你有足夠的專案經驗,在實際工作的時候不會因為一些小問題而產生一些嚴重的bug,也證明了你有實力勝任這份工作。要回答這個問題,我們必須先要理解c 的記憶體管理方式,需要站在記憶體四區的角度去審視一下 這樣整個理解了記憶體分配的方式,回答的時候就只需要注意一些細節了。寫乙個例子...

記憶體分配的三種方式

1.記憶體分配方式 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內...

C 三種記憶體分配方式

從靜態儲存區域分配 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。靜態分配的區域的生命期是整個軟體執行期,就是說從軟體執行開始到軟體終止退出。只有軟體終止執行後,這塊記憶體才會被系統 在棧上建立 在執行函式時,函式內區域性變數的儲存單元都可以...