char* str = "hello myname is Stack";
delete[] str;
为什么我的程序崩溃了?是否在堆栈上分配了char * str?
答案 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[]
时,它会尝试找到它先前分配的内存,并将这块内存返回给未分配的堆。这将失败,因为您没有在堆上分配您的变量。找不到有效的内存来解除分配后,将尝试写入空指针并导致崩溃。