1. 程式人生 > >C++經典面試之 記憶體分配的三種方式

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

把所有的點都說到,才能說明你有足夠的專案經驗,在實際工作的時候不會因為一些小問題而產生一些嚴重的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,不要存在野指標。