检测到堆损坏,同时删除动态二维字符数组

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)