删除字符* 崩溃程序

Deleting a char* crashing program

本文关键字:程序 崩溃 字符 删除      更新时间:2023-10-16
char* str = "hello myname is Stack";
delete[] str;

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

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

不,str不指向堆栈上的某些内容,而是指向字符串文本,该字符串文本是不可变的,通常驻留在只读段中。

您不能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(中。

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

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