1

为什么我在尝试删除 char 数组时会出现堆损坏。

下面的代码在“main()”中

case 'r':
        char *StrTReverse = new char;
        std::cout << "Enter a string: " << std::endl;
        std::cin  >> StrTReverse;
        std::cout << "String reversed: " << ReverseString(StrTReverse) << std::endl;
        system("pause");
        delete[] StrTReverse; <- Here the is the crash
        break;

下面是 ReverseString 函数

char* ReverseString(char string[])
{

int StringLength = std::strlen(string);
char *NewString = new char[StringLength];

for (int i = 0, j = StringLength-1; i < StringLength;i++,j--)
{
    NewString[i] = string[j];
}
NewString[StringLength] = '\0';
return NewString;

};

我不明白为什么会这样。我是 C++ 新手,所以请记住这一点。谢谢你的帮助 :)

4

3 回答 3

3
char *StrTReverse = new char;

您不分配数组,因此不要调用delete[]calldelete

代替

delete[] StrTReverse;

delete StrTReverse;

规则是调用delete返回的地址new&
调用delete []返回的地址new []

于 2012-05-12T14:16:33.810 回答
1
char *StrTReverse = new char;

这不是一个字符数组。它是指向在堆上分配的单个字符的指针。如果是数组,您需要编写如下内容:

char* myString = new char[100];
于 2012-05-12T14:17:11.653 回答
0

指出一些明显的事情:

char *NewString = new char[StringLength];
...
NewString[StringLength] = '\0';

如果你分配一个StringLength字符数组,你可以合法寻址的最后一个索引是StringLength - 1因为数组从 0 开始。

tl; dr:分配StringLength + 1字符。

于 2012-05-12T14:54:57.330 回答