回答
因为delete[]
是非法的,所以您没有用new[]
分配任何东西。而已。
没有,str
不点到堆栈上的东西,但是到了字符串字面,这是不可改变的,通常驻留在只读段。
所以它会在函数调用结束时自动删除str? – 2013-04-05 19:55:08
@JavaNewb不,不是字符串文字。字符串文字具有静态存储持续时间。他们持续整个计划。为什么?因为它们必须存储在你的可执行文件的某个地方,并且你的可执行文件被加载到内存中执行。 – 2013-04-05 19:55:41
@JavaNewb'str',是的,字符串本身 - 没有。但你不必担心。 – 2013-04-05 19:55:45
您不能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[]
时,它会尝试找到它先前分配的内存块,并将这块内存返回到未分配的堆。这会失败,因为你没有在堆上分配你的变量。没有找到有效的内存位来释放它,然后尝试写入空指针并产生崩溃。
字符串不在堆栈中。 – 2013-04-05 20:11:38
- 1. 删除QCamera崩溃程序
- 2. C程序,printf char *崩溃
- 3. AVL树删除导致程序崩溃
- 4. C++ char *错误,程序崩溃
- 5. 程序崩溃时使用char *
- 6. char arr =“...”;在C程序导致崩溃
- 7. CreateDirectory崩溃程序
- 8. 程序崩溃
- 9. C - 程序崩溃
- 10. C++程序崩溃
- 11. 程序崩溃
- 12. 引导程序崩溃立即崩溃
- 13. 程序崩溃::垫
- 14. Python程序崩溃
- 15. 删除线程时发生崩溃
- 16. 指针删除崩溃
- 17. 崩溃删除行的tableView
- 18. c + +删除阵列崩溃
- 19. 删除UITableViewCell导致崩溃
- 20. iOS - PFQueryTableViewController - 删除行崩溃
- 21. iPhone managedobject删除崩溃
- 22. 崩溃的删除片段
- 23. 程序崩溃
- 24. removeObjectAtIndex崩溃应用程序
- 25. C++/QT:QTextStream程序崩溃
- 26. qsort崩溃程序 - C
- 27. boost :: interprocess :: managed_shared_memory崩溃程序
- 28. 内联程序集崩溃?
- 29. C程序崩溃后strcpy
- 30. 有时程序崩溃
字符串文字具有静态存储持续时间。你只能用'new []''删除[]'你分配的内容。 – jrok 2013-04-05 19:54:49
仅仅因为它是一个指针并不意味着它需要被删除。 – 0x499602D2 2013-04-05 20:26:16