Как освободить память для символа * - PullRequest
0 голосов
/ 28 мая 2019

Я пишу текстовую ролевую игру и хочу в конце освободить память, и проблема в том, что один символ освобождается должным образом, а другой - я получаю, что 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, но когда я попробовал это в блоках кода, это работает просто отлично, так что, может быть, просто может быть, это какая-то проблема против

1 Ответ

0 голосов
/ 28 мая 2019

героев не появляется в вашем коде, но free(heroes); должно быть заменено на free(heroes[i]); в вашем цикле

после цикл может быть free(heroes);должно быть сделано, но только если это указатель, который вы выделили

...