删除字符* 崩溃程序
Deleting a char* crashing program
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[]
时,它将尝试查找它先前分配的内存块,并将此内存块返回到未分配的堆。这将失败,因为您没有在堆上分配变量。如果找不到要释放的有效内存位,它将尝试写入空指针并产生崩溃。
相关文章:
- 程序崩溃并显示"std::out_of_range"错误
- 试图创建流或fopen时程序崩溃
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 如何找出应用程序崩溃的原因 - Win 10 LTSB
- 操纵安卓相机的深度图导致应用程序崩溃
- 为什么当我尝试搜索双链表中第一个数据条目之外的数据时,程序崩溃了?
- DLL Made with CMake 使程序崩溃
- 程序崩溃使用boost::asio
- 调用 free() 有时会导致程序崩溃
- 邮件加密程序崩溃
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- For 循环在尝试读取数组 c++ 时程序崩溃
- 即使有 0 个错误,Getter 似乎也会使程序崩溃
- Windows桌面程序保存您的计算机会话 - 基于程序崩溃时的恢复会话
- 无法访问的代码如何导致我的程序崩溃?
- 矢量迭代器在尝试调用函数时使我的程序崩溃
- QCompleter set模型使应用程序崩溃
- 使用唯一指针调用函数会使我的程序崩溃
- 删除SDL_PollEvent时程序崩溃