检测到堆损坏,同时删除动态二维字符数组
Heap corruption detected, while deleting a dynamic 2d char array
我用 char** class 字段(动态二维数组)写了一个 class 名为 visa(基本上我希望有一个人访问过的国家)和 countriesVisited(实际上是数组的大小)。我故意不使用字符串。我已经添加了一个 class 方法,它将国家添加到提到的数组中,但是当我尝试删除数组元素时,我检测到 HEAP CORRUPTION: after Normal block (#158):
void ForeignPassport::addCountry(const char* country) {
char** tmp = new char* [countriesVisited + 1];
for (int i = 0; i < countriesVisited+1; i++) {
tmp[i] = new char[strlen(country)];
}
for (int i = 0; i < countriesVisited; i++) {
int f = 0;
while (visa[i][f-1] != '[=10=]') {
tmp[i][f] = visa[i][f];
f++;
}
}
for (int i = 0; i <= strlen(country); i++) {
if (i == strlen(country)) {
tmp[countriesVisited][i] = '[=10=]';
break;
}
tmp[countriesVisited][i] = country[i];
}
countriesVisited++;
for (int i = 0; i < countriesVisited-1; i++) {
delete[]visa[i];
}
visa = tmp ;
}
tmp[i] = new char[strlen(country)];
这里你分配的内存数量为 strlen(country)
但在这个循环中:
for (int i = 0; i <= strlen(country); i++) {
if (i == strlen(country)) {
tmp[countriesVisited][i] = '[=10=]';
break;
}
tmp[countriesVisited][i] = country[i];
}
这里你正在访问未分配的内存,这是不允许的,
所以将条件更改为 i < strlen(country)
我用 char** class 字段(动态二维数组)写了一个 class 名为 visa(基本上我希望有一个人访问过的国家)和 countriesVisited(实际上是数组的大小)。我故意不使用字符串。我已经添加了一个 class 方法,它将国家添加到提到的数组中,但是当我尝试删除数组元素时,我检测到 HEAP CORRUPTION: after Normal block (#158):
void ForeignPassport::addCountry(const char* country) {
char** tmp = new char* [countriesVisited + 1];
for (int i = 0; i < countriesVisited+1; i++) {
tmp[i] = new char[strlen(country)];
}
for (int i = 0; i < countriesVisited; i++) {
int f = 0;
while (visa[i][f-1] != '[=10=]') {
tmp[i][f] = visa[i][f];
f++;
}
}
for (int i = 0; i <= strlen(country); i++) {
if (i == strlen(country)) {
tmp[countriesVisited][i] = '[=10=]';
break;
}
tmp[countriesVisited][i] = country[i];
}
countriesVisited++;
for (int i = 0; i < countriesVisited-1; i++) {
delete[]visa[i];
}
visa = tmp ;
}
tmp[i] = new char[strlen(country)];
这里你分配的内存数量为 strlen(country) 但在这个循环中:
for (int i = 0; i <= strlen(country); i++) {
if (i == strlen(country)) {
tmp[countriesVisited][i] = '[=10=]';
break;
}
tmp[countriesVisited][i] = country[i];
}
这里你正在访问未分配的内存,这是不允许的,
所以将条件更改为 i < strlen(country)