0
char* str = "hello myname is Stack";
delete[] str;

为什么我的程序崩溃了?char* str 是否在堆栈上分配?

4

3 回答 3

5

因为它对delete[]你没有分配的任何东西都是非法的new[]。就是这样。

不,str它不指向堆栈上的某个东西,而是指向一个字符串字面量,它是不可变的,通常驻留在只读段中。

于 2013-04-05T19:54:26.313 回答
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程序运行时,文字驻留在只读内存 ( ) 中。

于 2013-04-05T20:06:23.467 回答
0

Luchian 已经描述了这个问题,我想给出它崩溃的可能原因。

堆将存储已分配的内存块列表;当你调用delete[]它时,它会尝试找到它之前分配的内存块,并将这块内存返回到未分配的堆中。这将失败,因为您没有在堆上分配变量。如果未能找到有效的内存位来释放它,它将尝试写入空指针并产生崩溃。

于 2013-04-05T20:07:29.417 回答