1、內存的分配方式分為 靜態存儲區、棧、堆。
靜態存儲區:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,比如 全局變量。
棧:在棧上創建,在函數(main函數或其他子函數)執行期間,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動釋放。所以我們不能返回在函數內部定義的變量(函數內定義的指針可以返回),因為他們在函數執行結束時已經被銷毀了。處理器的指令集中有關於棧內的分配運算,因此效率很高,但是分配的內存資源有限。
堆:從堆上分配,亦稱為動態內存分配,使用new或malloc等申請任意多內存,程序員自己決定何時釋放內存,使用靈活,問題也經常出現在這里。
2、動態內存的傳遞:
首先,子函數內不能返回出指針之外的其他變量,http://www.cnblogs.com/audi-car/p/4753292.html
其次,調用子函數時,編譯器默認情況下,會自動為參數列表的每個參數制作臨時的變量,這些臨時變量的改變並不能真正傳回到主函數內,且這些臨時變量會在函數調用結束時,自動銷毀(動態申請的內存除外,它不會銷毀)。所以靠他們來實現參數或者內存的傳遞純屬扯淡。
最典型的例子,就是比較基礎的swap()函數,還有下面這個例子:
void getMemory(char *p) { p=new char[10]; } int main(int argc, char **argv) { char *str=NULL; getMemory(str); //char *str=new char[10]; cout<<str<<endl; return 0; }
在執行cout<<str<<endl;時,程序會崩潰。因為這個指針沒有初始化,也沒能從子函數內申請到內存空間,是指向未知位置的,所以會崩。。
3、怎么解決第2步的問題?
很簡單,用引用就可以解決了
void getMemory(char *&p) //使用引用 { p=new char[10]; } int main(int argc, char **argv) { char *str=NULL; getMemory(str); //char *str=new char[10]; cout<<str<<endl; return 0; }

4、為什么使用引用就可以解決問題了呢?
因為這個時候,編譯器就不會在給參數p制作一個臨時變量了,我們明確指出了這是一個副本(引用,其實就是被引用對象的副本),他在子函數執行結束的時候也就不會在被釋放了。
以上內容,個人觀點,歡迎指正。