2013-04-05 111 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