繁体   English   中英

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

[英]c++ heap corruption when deleting char array

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

char *StrTReverse = new char;

你没有分配数组所以不要调用delete[] call delete

更换

delete[] StrTReverse;

delete StrTReverse;

规则是对new &返回的地址进行调用delete
new []返回的地址上调用delete [] new []

char *StrTReverse = new char;

这不是一系列字符。 它是指向堆上分配的单个char的指针。 如果是数组,你需要写这样的东西:

char* myString = new char[100];

指出明显的事情:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM