char* str = "hello myname is Stack";
delete[] str;
为什么我的程序崩溃了?char* 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[]
它时,它会尝试找到它之前分配的内存块,并将这块内存返回到未分配的堆中。这将失败,因为您没有在堆上分配变量。如果未能找到有效的内存位来释放它,它将尝试写入空指针并产生崩溃。