【问题标题】:Basic Malloc/Free基本 Malloc/免费
【发布时间】:2011-10-29 22:49:38
【问题描述】:

如果我有这样的程序片段:

struct Node *node;
while(...){
    node = malloc(100);
    //do stuff with node
}

这意味着每次我循环通过 while 循环时,我都会重新分配节点指针指向的 100 个字节,对吗?

如果这是真的,那么如果我只剩下一个指向最后发生的 malloc 的指针,我该如何释放所有循环所产生的所有内存?

谢谢!

【问题讨论】:

  • 简而言之,你不能。经验法则“每个malloc 必须与free 配对”是有原因的。

标签: c malloc free


【解决方案1】:

请准确分配您需要的大小:malloc(sizeof *node); -- 如果您迁移到 64 位平台,使所有成员的大小翻倍,您的旧 96 字节结构在新环境中可能需要 192 字节。

如果您没有任何指向您创建的任何struct Nodes 的指针,那么我认为您首先不应该使用malloc(3) 分配它们。如果您的应用程序需要数据在当前函数的调用范围之外持久存在,malloc(3) 是最好的选择。我希望你可以像这样重写你的函数:

struct Node node;
while(...){
    //do stuff with node
}

while(...){
    struct Node node;
    //do stuff with node
}

取决于您是否要访问最后一个节点(第一个版本)或不访问(第二个版本)。

当然,如果您确实需要这段代码之外的那些结构,那么您需要在某处存储对它们的引用。将它们添加到跟踪 struct Node 对象的全局列表中,或者将每个添加到 previous struct Nodenext 指针,或者将每个添加到对应的 struct User 引用对他们来说,无论是最适合您的应用程序。

【讨论】:

  • 更好:node = malloc(sizeof *node);。 (需要明确的是,在malloc(3) 中,3 指的是 Unix 手册的第 3 节;这并不意味着您要分配 3 个字节。)
【解决方案2】:

如果你在循环之前设置 node = NULL 然后在 node = malloc(100) 之前使用 free(node) 你应该没问题。循环退出后,您还需要执行 free(node)。但是话又说回来,这一切都取决于“//用节点做东西”实际上做了什么。正如其他人指出的那样, malloc(100) 不是一个好主意。我会使用 malloc(sizeof(*node))。这样,如果节点类型发生变化,您不必更改 malloc 行。

【讨论】:

  • 这在 sizeof(struct Node) 恰好是 100 字节的单一架构之外是不安全的。你应该从不 malloc 一个这样的结构,而是使用malloc(sizeof(struct Node))
  • @BrianRoach - 我只是在解决他的问题,而不是他的技术。事实上,我更喜欢使用 malloc(sizeof(*node))。
  • @BrianRoach,最好使用malloc(sizeof(*node)))
【解决方案3】:

如果您在一次迭代结束时不再需要 malloc 的空间,您应该立即释放它。

要跟踪分配的节点,您可以将它们保存在动态增长的列表中:

#include <stdlib.h>

int main() {
    int i;
    void *node;
    int prt_len = 0;
    void **ptrs = NULL;
    for (i = 0; i < 10; i++) {
        node = malloc(100);
        ptrs = realloc(ptrs, sizeof(void*) * ++prt_len);
        ptrs[prt_len-1] = node;
        /* code */
    }
    for (i = 0; i < prt_len; i++) {
        free(ptrs[i]);
    }
    free(ptrs);
    return 0;
}

注意:如果您需要使用此类方法,您可能应该重新考虑您的算法!

否则请参阅sarnold's answer

【讨论】:

    【解决方案4】:

    如果我只剩下一个指向最后发生的 malloc 的指针,我该如何释放所有循环所产生的所有内存?

    你不能。你刚刚创建了一个巨人memory leak

    当你用完它时,你必须跟踪你 malloc()free() 的每一块内存。

    【讨论】:

      【解决方案5】:

      你不能。您需要存储所有指针以释放内存。如果您将这些指针保存在某处,那么只有您可以释放内存。

      【讨论】:

      • 您是否阅读过其他答案?请写 you,而不是 u。事实上,这适用于生活的方方面面:如果你没有足够的时间再打两个字母,那就什么都别写。不管你说什么什么,写ur听起来很蠢。
      • @kay 没有难受的感觉,但使用“u”或“You”对我来说并不重要。而且它也不应该成为伟大的思想家,因为它已被科学证明,Mind 从不阅读完整的拼写:)
      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2018-02-04
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多