我是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;