我是C++的新手,尝试按照教程系列学习语言,分配内存时遇到的挑战是为26个字符分配内存,然后用字母,abcde等填充它们。

我以为我知道解决方案,但是遇到了这个错误:Invalid address specified to RtlValidateHeap( 00490000, 0049D9EC )让我失望的部分是程序完全执行,但是仍然会抛出此错误

这是我的代码:

char c = 'a';
char *pChar = new char[26];

for (int i = 0; i < 26; i++, pChar++, c++) {
    *pChar = c;
    cout << *pChar << flush;
}

delete[] pChar;

抱歉,如果措辞不佳,我对c++和stackoverflow都是陌生的。

最佳答案

当您说delete[] pChar;时,您实际上是在尝试删除pChar当前指向的内容,这与最初分配的位置不同。

简而言之,当您使用new分配某些内容时,它通常会将有关分配的数据(例如,分配的大小,因此您不必像刚使用C++时那样必须说delete[26] pChar;)通常放在新分配的内存的左侧,尝试使用它来释放内存时,可能会将您所写的内容(字母)解释为该信息,这当然是行不通的。

您应该将原始指针的副本存储到已分配的内存中,并使用它来删除,或者使用更好的选择,使用i和下标通过指针算术索引,而不是像这样:

char c = 'a';
char *pChar = new char[26];

for (int i = 0; i < 26; i++, c++) {
    pChar[i] = c;
    cout << pChar[i] << flush;
}

delete[] pChar;

09-06 12:22