«Программа сработала точку останова», в то время как свободная память используется - PullRequest
0 голосов
/ 08 января 2020

Когда я освобождаю память, возникает ошибка «Программа сработала в точке останова». Проверьте код ниже, интересно, где не так?

 int SSavep(char *visited, int t, int n, int m)
    { 

        int* map = (int*)malloc(m*n * sizeof(int));
        int* q = (int*)malloc(m*n * sizeof(int));
        int count = 0, cur = 0;
        int begin = 0, end = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //set value for map
            }
        }
        ..........
        if (t >= map[end]) {
            free(map);
            free(q);
            return 0;
        }
        else{
            free(map);
            free(q);
            return -1;
        }
    }  

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вы получаете сообщение об ошибке >> free (q);

for m=n=4

int* q = (int*)malloc(m*n * sizeof(int));
q == [m*n*sizeof(int)] == 4*4*4 == 64 bytes == int[16];

Поскольку вы записали за пределы адресного пространства, зарезервированного для переменной-указателя 'q'. проверьте переменную count перед свободным (q). У меня есть 1208, вызванный с помощью:

char* visited = new char[100 * 100];
memset(visited, 0, 10000);
int res = SSavep(visited, 0, 4, 4);

Кстати, этот al go выглядит очень похоже на поиск пути, который исследует соседние ячейки на карте и присваивает веса, верно? Если это так, есть много решений с открытым исходным кодом, почему бы не использовать их вместо изобретения колеса? На вики-странице Path Finding есть ссылки на решения с открытым исходным кодом:

https://en.wikipedia.org/wiki/Pathfinding

проверьте ссылки внизу страницы.

0 голосов
/ 08 января 2020

весь код выглядит следующим образом:

stati c int dir [4] [2] = {{0,1}, {0, -1}, {1,0}, { -1,0}};

int SSavep (символ * посещен, int t, int n, int m) {

int* map = (int*)malloc(m*n * sizeof(int));
int* q = (int*)malloc(m*n * sizeof(int));
int count = 0, cur = 0;
int begin = 0, end = 0;
for (int i = 0; i < m; i++) {
    for (int j = 0; j < n; j++) {
        if (visited[i*n + j] == '.')
            map[i*n + j] = 0;
        else if (visited[i*n + j] == '*')
            map[i*n + j] = -1;
        else if (visited[i*n + j] == 'p') {
            map[i*n + j] = -12;
            end = i*n + j;
        }
        else {
            map[i*n + j] = -9;
            begin = i*n + j;
        }   
    }
}

q[count++] = begin;
while (cur < count && q[cur] != end) {
    int i = q[cur] / n;
    int j = q[cur] % n;
    for (int k = 0; k < 4; k++) {
        int ni = i + dir[k][0];
        int nj = j + dir[k][1];
        if (ni < 0 || ni >= m || nj < 0 || nj >= n || map[ni*n + nj]>0 || map[ni*n + nj] == -1)
            continue;
        map[ni*n + nj] = map[i*n + j] + 1;
        q[count++] = ni*n + nj;
    }
    cur++;
}
if (map[end] > 0 && t >= map[end]) {
    free(map);
    free(q);
    return 0;
}
else{
    free(map);
    free(q);
    return -1;
}

}

...