我是C ++的新手,尝试按照教程系列来学习语言,分配内存的挑战是为26个字符分配内存,然后用字母表填充它们,abcde ......等。
我以为我知道解决方案,但遇到了这个错误:
$my_job
让我失望的部分是程序完全执行,a-z但仍然会抛出此错误
这是我的代码:
Invalid address specified to RtlValidateHeap( 00490000, 0049D9EC )
如果问题措辞不当,我很抱歉,我是c ++和stackoverflow的新手。
答案 0 :(得分:5)
当您说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;
答案 1 :(得分:2)
问题是,当控制离开循环时,pChar
指向一个超过数组末尾的位置。然后你在那个指针上调用delete[]
,这就像把一个破坏的球穿过错误的房子。
答案 2 :(得分:1)
正如在其他答案中已经提到的那样,您无法在调用delete[]
后更改的指针上调用new []
。这是未定义的行为。
delete []
需要传递与调用new[]
时完全相同的指针值。
这是最简单的解决方法,无需更改pChar
:
#include <iostream>
int main()
{
char c = 'a';
char *pChar = new char[26];
for (int i = 0; i < 26; ++i) {
pChar[i] = c; // access the character by index ...
std::cout << pChar[i] << std::flush; // access the character by index ...
// ++pChar; DON'T change the original pointer
++c;
}
delete[] pChar;
return 0;
}