删除char *崩溃程序

时间:2013-04-05 19:53:40

标签: c++ char

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

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

3 个答案:

答案 0 :(得分:5)

因为delete[]您未使用new[]分配的内容,这是非法的。就是这样。

不,str不会指向堆栈上的某些内容,而是字符串文字,它是不可变的,通常驻留在读取中 - 只有细分。

答案 1 :(得分: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)中。

答案 2 :(得分:0)

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

堆将有一个已存储的已分配内存块的列表;当你调用delete[]时,它会尝试找到它先前分配的内存,并将这块内存返回给未分配的堆。这将失败,因为您没有在堆上分配您的变量。找不到有效的内存来解除分配后,将尝试写入空指针并导致崩溃。

相关问题