为什么在尝试删除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 ++的新手,所以请记住这一点。 谢谢你的帮助:))
答案 0 :(得分:3)
char *StrTReverse = new char;
你没有分配数组,所以不要拨打delete[]
来电delete
替换
delete[] StrTReverse;
与
delete StrTReverse;
规则是delete
&amp;
返回的地址new
在delete []
返回的地址上致电new []
。
答案 1 :(得分:1)
char *StrTReverse = new char;
这不是一系列字符。它是指向堆上分配的单个char的指针。如果是数组,你需要写这样的东西:
char* myString = new char[100];
答案 2 :(得分:0)
指出明显的事情:
char *NewString = new char[StringLength];
...
NewString[StringLength] = '\0';
如果您分配了StringLength
个字符的数组,那么您可以合法地处理的最后一个索引是StringLength - 1
,因为数组从0开始。
tl; dr:分配StringLength + 1
字符。