最近找工作,幾乎所有的公司有要考C/C++ ,沒有辦法,呵呵~~~~只有慢慢的開始 拾起 C++ 來,好久沒有弄過C++ 了,基本語法都忘得差不多了,呵呵~~~今天看了《高質量的 C++編程》,現摘下一些話,已備忘記查找。
C++內存分配方式
內存分配方式有三種:
(1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
(2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
(3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由我們決定,使用非常靈活,但問題也最多。
EG:
用函數返回值來傳遞動態內存
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
|
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
|
但是下面這種事有問題的:
char *GetString(void)
{
char p[] = "hello world";
return p; // 編譯器將提出警告
}
|
void Test4(void)
{
char *str = NULL;
str = GetString(); // str 的內容是垃圾
cout<< str << endl;
}
|
這里強調不要用return語句返回指向“棧內存”的指針,因為該內存在函數結束時自動消亡,如上面的示例。 用調試器逐步跟蹤Test4,發現執行str = GetString語句后str不再是NULL指針,但是str的內容不是“hello world”而是垃圾。
如果把示例7-4-4改寫成示例7-4-5,會怎么樣?
char *GetString2(void)
{
char *p = "hello world";
return p;
}
|
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
|
示例7-4-5 return語句返回常量字符串
函數Test5運行雖然不會出錯,但是函數GetString2的設計概念卻是錯誤的。因為GetString2內的“hello world”是常量字符串,位于靜態存儲區,它在程序生命期內恒定不變。無論什么時候調用GetString2,它返回的始終是同一個“只讀”的內存塊