2013-04-05 113 views
0
char* str = "hello myname is Stack"; 
delete[] str; 

爲什麼我的程序崩潰? char * str被分配在堆棧上嗎?刪除char *崩潰程序

+2

字符串文字具有靜態存儲持續時間。你只能用'new []''刪除[]'你分配的內容。 – jrok 2013-04-05 19:54:49

+0

僅僅因爲它是一個指針並不意味着它需要被刪除。 – 0x499602D2 2013-04-05 20:26:16

回答

5

因爲delete[]是非法的,所以您沒有用new[]分配任何東西。而已。

沒有,str點到堆棧上的東西,但是到了字符串字面,這是不可改變的,通常駐留在只讀段。

+0

所以它會在函數調用結束時自動刪除str? – 2013-04-05 19:55:08

+0

@JavaNewb不,不是字符串文字。字符串文字具有靜態存儲持續時間。他們持續整個計劃。爲什麼?因爲它們必須存儲在你的可執行文件的某個地方,並且你的可執行文件被加載到內存中執行。 – 2013-04-05 19:55:41

+0

@JavaNewb'str',是的,字符串本身 - 沒有。但你不必擔心。 – 2013-04-05 19:55:45

0

您不能delete東西沒有與new分配。此外,該字符串駐留在只讀存儲器中,無法刪除。

要看到這一點,請嘗試使用-S編譯。例如。

// ex.c 
int main(){ 
    const char * s = "hello my name is Stack"; 
} 

gcc -S ex.c 

編譯你會得到包含在頂部以下文件ex.s

.file "ex.c" 
    .section .rodata 
.LC0: 
    .string "hello my name is Stack" 
    .text 

正如你所看到的,字符串本身是在組裝,它不會在運行時分配。程序運行時,文字駐留在只讀存儲器(.rodata)中。

0

Luchian已經描述了這個問題,我想給出它崩潰的可能原因。

堆將有一個存儲列表,它已經分配了什麼內存塊;當你調用delete[]時,它會嘗試找到它先前分配的內存塊,並將這塊內存返回到未分配的堆。這會失敗,因爲你沒有在堆上分配你的變量。沒有找到有效的內存位來釋放它,然後嘗試寫入空指針併產生崩潰。

+1

字符串不在堆棧中。 – 2013-04-05 20:11:38