程序在解除分配字符数组时崩溃

Programme crashes while deallocating a character array

本文关键字:崩溃 数组 字符 解除分配 程序      更新时间:2023-10-16

当我在调试模式下运行使用以下代码创建的.exe时,它显示一些断言失败并且程序崩溃但是当我运行从以下代码的发布模式创建的相同exe时,它工作正常。

请帮助确定为什么我在调试模式下得到断言失败,但在发布模式下却没有。

#include<iostream>
using namespace std;
#include<string.h>
void main()
{
    char *buf  = new char[5];   //pre-allocated buffer
    buf = "Hello";
    delete [] buf;
    getchar();
    //cout<<buf;
    //string *p = new (buf) string("hi");  //placement new
    //string *q = new string("hi");  //ordinary heap allocation
}
 char *buf  = new char[5];   //pre-allocated buffer

在这里,您定义一个指针,并将其初始化为指向动态分配的缓冲区,该缓冲区可容纳 5 个字符。

buf = "Hello";

在这里,您将初始化指针以指向字符串文本的开头。

 delete [] buf;

在这里,您删除 buf 指针,但 buf 指针不再指向您新 [] 的任何内容,它指向字符串文字。您只能删除/删除 [] 指向您从 new/new [] 获得的内容的指针。所以你会得到未定义的行为,并且可能会崩溃

您可能打算将字符串的内容复制到新 []'d 的缓冲区中。 请记住考虑 NUL 终止符:

int main()
{
    char *buf  = new char[6];   //pre-allocated buffer
    strcpy(buf, "Hello");
    delete [] buf;
    getchar();
    //cout<<buf;
    //string *p = new (buf) string("hi");  //placement new
    //string *q = new string("hi");  //ordinary heap allocation
}

不过,在C++中,您宁愿使用 std::string from #include <string> ;

std::string = "Hello";
  1. void main错了。 main返回int .没有例外。
  2. 你在做delete[] "Hello". "Hello" 是字符串文字;你不能delete它。

当你这样做时:

buf = "Hello";

您基本上是在更改buf指向只读内存区域的指针值(内存地址),因为"Hello"是字符串文本,因此存储在只读内存中。

然后你试图释放该内存,因此崩溃。

此外,"Hello"的长度为 6 个字节,而不是 5 个字节。

因为未定义的行为意味着任何事情都可能发生。问题是buf = "Hello"将字符串文字的地址分配给buf,然后尝试删除该文字。在调试模式下编译时,检查代码看到无法删除地址;在发布模式下,检查未完成,删除只是踩到不重要的东西。

您正在尝试解除分配字符串文字"Hello"。这一行:

buf = "Hello";

指针buf重定向到指向文字"Hello"。您可能打算这样做:

char *buf = new char[6]; //need one extra space for terminating NUL character
strcpy(buf, "Hello");
 char *buf  = new char[6];   //pre-allocated buffer
 strncpy(buf, "hello", 6);
 delete [] buf;
buf = "hello"

; 将 buf 的值从指向新字符[6] 的指针更改为指向 "hello" 的指针,即不在堆中的内存块。