我正在写文本rpg游戏,最后我想释放内存,问题是一个字符*正确释放,另一个字符*我得到game.exe触发了断点错误,但是我可以找不到那些情况有什么不同。
skills *_skills;
_skills = (skills*)malloc(moj_konfig.skill_n * sizeof(skills));
for (int i = 0; i < moj_konfig.skill_n; i++)
{
_skills[i].name = malloc(moj_konfig.ile_znakow * sizeof(char));
}
items **_it;
_it = (items**)malloc(moj_konfig.ekwipunek_wiersze * sizeof(items *));
if (_it == NULL) exit(1);
for (int i = 0; i < moj_konfig.ekwipunek_wiersze; i++)
{
_it[i] = malloc(moj_konfig.ekwipunek_kolumny * sizeof(items));
for (int j = 0; j < moj_konfig.ekwipunek_kolumny; j++)
{
_it[i][j].nazwa = malloc(moj_konfig.ile_znakow * sizeof(char));
}
if (_it[i] == NULL) exit(1);
}
quests *_quests;
_quests = (quests*)malloc(moj_konfig.ilosc_q * sizeof(quests));
for (int i = 0; i < moj_konfig.ilosc_q; i++)
{
_quests[i].name = malloc(moj_konfig.ile_znakow * sizeof(char));
_quests[i].done = 0;
_quests[i].taken = 0;
}
它在最后返回结构类型的函数中
ret->it = _it;
ret->skill = _skills;
ret->quest = _quests;
return ret;
解除分配看起来像这样:
for (int i = 0; i < moj_konfig.max_hero; i++)
{
for (int j = 0; j < moj_konfig.ekwipunek_wiersze; j++)
{
for (int z = 0; z < moj_konfig.ekwipunek_kolumny; z++)
{
free(heroes[i].it[j][z].nazwa);
}
free(heroes[i].it[j]);
}
free(heroes[i].it);
for (int j = 0; j < moj_konfig.ilosc_q; j++)
{
free(heroes[i].quest[j].name);
}
free(heroes[i].quest);
for (int j = 0; j < moj_konfig.skill_n; j++)
{
free(heroes[i].skill[j].name);
}
free(heroes[i].skill);
free(heroes[i].name);
free(heroes);
}
只有当我释放技能名称和任务名称时,我才会出错,而当我释放物品名称时,我不会出错。 (是物品)
编辑::我做了一些更改,但仍然无法在Visual Studio中使用,但是当我在代码块中尝试时,它的效果很好,所以也许,也许是某种vs问题。
答案 0 :(得分:0)
英雄不会出现在您的代码中,但在循环中free(heroes);
必须替换为free(heroes[i]);
之后,必须完成free(heroes);
循环,但前提是该循环是您分配的指针