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;

配列を割り当てないので、call をdelete[]呼び出さないでくださいdelete

交換

delete[] StrTReverse;

delete StrTReverse;

ルールは call deleteon address returned by new&
call delete []on address returned bynew []です。

于 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';

文字の配列を割り当てる場合、配列は0 から始まるため、StringLength合法的にアドレス指定できる最後のインデックスは.StringLength - 1

tl;dr:StringLength + 1文字を割り当てます。

于 2012-05-12T14:54:57.330 に答える