【问题标题】:How to deallocate memory for char*如何为 char* 释放内存
【发布时间】:2019-10-14 05:25:37
【问题描述】:

我正在编写文本 rpg 游戏,最后我想释放内存,问题在于一个 char* 正确释放,而另一个 char* 我得到 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 问题

【问题讨论】:

  • 仅供参考,以下划线开头的名称是保留的,可能会导致未定义的行为。而且它们很丑。
  • 尝试通过 valgrind 运行您的代码。如果你的内存管理不善,它会告诉你在哪里。
  • @EugeneSh。我认为这只是如果前导下划线后跟一个大写字母,或者如果名称包含两个下划线,则它是保留的。还是很丑。
  • 不清楚moj_konfig.ile_znakow 是什么,但您在为名称分配空间时是否忘记允许字符串终止符?
  • @ThomasJager 在这里阅读第二个项目符号:port70.net/~nsz/c/c11/n1570.html#7.1.3p1 有点晦涩,所以现在你让我怀疑了。

标签: c arrays char malloc free


【解决方案1】:

heroes 不会出现在您的代码中,但 free(heroes); 必须在您的循环中替换为 free(heroes[i]);

之后循环可能是free(heroes); 必须完成,但前提是它是您分配的指针

【讨论】:

  • @TomaszGłowacki 你没有提供足够的代码让我们编译和执行或者只是检查一下;-)
  • 我的意思是代码很长,我不知道如何剪切它,所以你可以编译它来解决这个问题
  • @TomaszGłowacki 是的,我明白,但我们不是特别清楚 ^^ 如果你不能考虑我的话,如果你可以在 valgrind 下执行你的代码来查看你的无效的内存访问,或在调试器下
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2018-04-19
  • 2018-10-16
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多