【问题标题】:Does C reuse memory after reassignment?C在重新分配后是否重用内存?
【发布时间】:2012-01-25 17:45:28
【问题描述】:

我正在编写一个 C 程序来计算粒子的路径(类似于三体问题)。在我的代码中,我有 typedef 的结构来表示粒子,以及一组向量来表示粒子的速度、加速度和位置。由于这是一个迭代解决方案,我必须重新计算所有这些(并因此 malloc 一个新向量)数千次,并在每次迭代中将它们重新分配给父结构,如下所示:

while(collisionCheck(particle, mass0, mass1) == 0)
{
    particle-> velocity = recalculateVelocity(particle);
}

我担心 C 将如何处理孤立结构,我应该像这样释放旧结构吗?

while(collisionCheck(particle, mass0, mass1) == 0)
{
    free(particle-> velocity);
    particle-> velocity = recalculateVelocity(particle);
}

或者C垃圾会自动收集孤儿并重用内存空间?

【问题讨论】:

    标签: c memory-management free


    【解决方案1】:

    嗯……C确实没有任何垃圾回收。

    对于您malloc 的每个内存区域,您有责任free:自己负责。

    但是,一旦内存被freed,它通常会被重新使用。

    【讨论】:

      【解决方案2】:

      只有当 particle->velocity 是一个指针并且 recalculateVelocity() 实际创建一个新结构(或其他)并返回指向它的指针时才可用。

      如果您不使用malloc(),则不得使用free()。如果您使用过malloc(),则必须使用free()。这里唯一的例外是realloc()

      【讨论】:

        【解决方案3】:

        C 不是垃圾收集器,因此它不会 垃圾收集任何东西。为了释放内存,您必须在分配了malloc() 后使用free() 函数。

        所以答案是,如果 particle->velocity 是您之前使用 malloc() 分配的空间的唯一指针,那么您必须在分配给该指针之前使用 free() 释放内存,因为这意味着您没有不再有 any 指向该空间的指针,即memory leak

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-30
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-17
          相关资源
          最近更新 更多