我正在尝试为特定拼图编写解算器。它试图通过逐个尝试每个可能的移动来找到解决方案,直到找到解决方案。第一个版本尝试通过不断尝试移动直到失败然后回溯来解决深度优先问题,但结果却太慢了。我已经使用队列结构将其重写为广度优先,但我在内存管理方面遇到了问题。
以下是相关部分:
int main(int argc, char *argv[])
{
...
int solved = 0;
do {
solved = solver(queue);
} while (!solved && !pblListIsEmpty(queue));
...
}
int solver(PblList *queue) {
state_t *state = (state_t *) pblListPoll(queue);
if (is_solution(state->pucks)) {
print_solution(state);
return 1;
}
state_t *state_cp;
puck new_location;
for (int p = 0; p < puck_count; p++) {
for (dir i = NORTH; i <= WEST; i++) {
if (!rules(state->pucks, p, i)) continue;
new_location = in_dir(state->pucks, p, i);
if (new_location.x != -1) {
state_cp = (state_t *) malloc(sizeof(state_t));
state_cp->move.from = state->pucks[p];
state_cp->move.direction = i;
state_cp->prev = state;
state_cp->pucks = (puck *) malloc (puck_count * sizeof(puck));
memcpy(state_cp->pucks, state->pucks, puck_count * sizeof(puck)); /*CRASH*/
state_cp->pucks[p] = new_location;
pblListPush(queue, state_cp);
}
}
}
free(state->pucks);
return 0;
}
当我运行它时,我收到错误:
ice(90175) malloc: *** mmap(size=2097152) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Bus error
错误发生在迭代93,000周围。 据我所知,错误消息来自malloc失败,总线错误来自后面的memcpy。
我很难相信我的内存不足,因为每个游戏状态只有大约400字节。然而,这看起来似乎正在发生的事情,因为活动监视器报告它在崩溃之前使用3.99GB。我正在使用http://www.mission-base.com/peter/source/作为队列结构(它是一个链表)。
显然,我正在做一些愚蠢的事情。有什么建议吗?答案 0 :(得分:2)
检查malloc
的结果。如果是NULL
,您可能希望打印出该队列的长度。
此外,您发布的代码段不包含任何free
s ...
答案 1 :(得分:1)
完成后,您需要free()
手动分配的内存;动态记忆不只是“自由”