2010-08-11 46 views
4

於是,我問這個問題的一個基本的文本輸入功能的我在C++的書看上下文:爲什麼指針的分配內存會在函數後面存在,但不是數組?

char *getString() 
{ 
    char temp[80]; 
    cin >> temp; 
    char * pn = new char[strlen(temp + 1)]; 
    strcpy(pn, temp); 
    return pn; 
} 

所以臨時宣佈的80個字符數組,自動變量,其內存將被釋放,一旦getString()回報。有人建議,如果由於某種原因返回temp,則在該函數之外的使用將不可靠,因爲該函數完成後釋放內存。但既然我也在同一個上下文中聲明pn,它的內存怎麼不會被丟棄呢?

+3

它沒有核心轉儲執行嗎?你認爲它應該是strlen(temp)+1而不是strlen(temp + 1)? – KedarX 2010-08-11 06:08:19

回答

11

因爲您聲明的對象是new在堆上分配,而像temp這樣的變量位於堆棧上。

當你的函數返回時,它的棧幀被解除分配,但堆不受影響。

+0

感謝您的回覆。我也意識到,更具體地說,分配給pn(保存該指針地址數據的空間)的內存被丟棄,這就是爲什麼它的內容必須返回給調用函數才能使用它。 pn指向的內存是動態分配的,並根據您的回答進行操作。 – soula 2010-08-11 03:57:02

相關問題