删除char数组时c ++堆损坏

时间:2012-05-12 14:15:26

标签: c++ arrays char heap corruption

为什么在尝试删除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 ++的新手,所以请记住这一点。 谢谢你的帮助:))

3 个答案:

答案 0 :(得分:3)

char *StrTReverse = new char;

你没有分配数组,所以不要拨打delete[]来电delete

替换

delete[] StrTReverse;

delete StrTReverse;

规则是delete&amp;
返回的地址newdelete []返回的地址上致电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字符。