是否必须释放每个malloc调用

是否必须释放每个malloc调用,c,pointers,malloc,C,Pointers,Malloc,据我所知,因为malloc动态分配mem,所以您需要释放该mem,以便它可以再次使用 如果返回使用malloc创建的char*,会发生什么情况(即,您应该如何释放该char*) 如果指针保持原样 然后退出应用程序,会是吗 我找不到一个明确的答案,有人说是,有人说不是 对。如果你是malloc,你需要自由。如果不释放内存,则保证程序运行时内存泄漏 释放它 总是 句号。是的,每个对的呼叫都必须与对的呼叫相匹配 要回答您的具体问题: 您必须明确记录API,告诉用户返回的指针是否必须是free()'d

据我所知,因为malloc动态分配mem,所以您需要释放该mem,以便它可以再次使用

  • 如果返回使用malloc创建的char*,会发生什么情况(即,您应该如何释放该char*)
  • 如果指针保持原样 然后退出应用程序,会是吗 我找不到一个明确的答案,有人说是,有人说不是

  • 对。如果你是malloc,你需要自由。如果不释放内存,则保证程序运行时内存泄漏

    释放它

    总是

    句号。

    是的,每个对的呼叫都必须与对的呼叫相匹配

    要回答您的具体问题:

  • 您必须明确记录API,告诉用户返回的指针是否必须是
    free()
    'd
  • 操作系统将释放分配给进程的所有内存 1) 与正常释放内存的方式相同,即

    p = func();
    //...
    free(p);
    
    诀窍在于确保你总是这样做

    2) 一般来说,是的。但是你仍然应该释放你作为良好实践使用的任何内存。不花时间找出在哪里释放内存只是懒惰

  • 如果您有一个指向由
    malloc
    创建的内存的指针,
    使用该指针释放该内存将是正确的。是的,这里面有一些魔力;这将由编译器处理

  • 是的,如果忽略内存释放并退出应用程序,操作系统将释放内存。然而,让它不缠绕被认为是不好的做法。操作系统可能做不到正确的事情(尤其是在嵌入式设置中),或者可能没有及时完成。此外,如果您持续运行程序,您可能会消耗越来越多的内存,最终耗尽所有内存,并耗尽内存并崩溃


  • 让我们一次只看一点

  • 如果您返回一个
    char*
    ,您知道它是用
    malloc
    创建的,那么是的,您有责任释放它。您可以使用
    free(myCharPtr)
    实现这一点

  • 操作系统将收回内存,并且不会永远丢失,但技术上无法保证在应用程序死亡时立即回收内存。这取决于操作系统


  • 如果您自己编写函数:请避免这样做

    • 相反,让调用者传递一个缓冲区,让调用者指定缓冲区的大小并将数据复制到该缓冲区中。这样,您就可以从其他不使用相同堆的模块(其他编程语言、不同的C运行时…)中使用您的函数
    • 如果出于任何原因不能使用这样的接口,请在函数的文档中指定调用方必须在处理完返回的指针后释放它
    如果您使用的是库函数:请查看文档

    • 如果文档说明您必须释放,请执行此操作
    • 如果文档说明您不必这样做,那么可能需要调用一些全局清理函数来释放模块的资源
    关于第二个问题,建议在退出前释放。从技术上讲,这不会有什么坏处,但是当你想要在更大的项目中重用你的代码时,你首先会感谢你编写了正确的清理程序

  • 调用方必须释放(或安排释放)。这意味着创建和返回资源的函数需要准确地记录应该如何释放资源

  • 作为“进程”定义的一部分,大多数操作系统将在程序退出时释放内存。C标准不关心会发生什么,它超出了程序的范围。并非所有操作系统都有完整的流程抽象,但桌面风格的操作系统确实有

  • 在此之前释放它的主要原因是:

    • 如果您尽快释放内存,通常在进程退出之前很长一段时间,您的程序将使用更少的内存总量
    • 如果你不释放它,然后你想把你的程序变成另一个程序中的一个例程,这个例程可能被调用了很多次,那么突然你需要的内存是以前的很多倍(内存泄漏)
    • 有一些调试工具可以帮助您识别内存泄漏,方法是在程序退出时警告您仍在分配内存。如果有很多故意泄露的垃圾需要涉过,这些并没有多大帮助
    • 如果你没有释放它,并且遇到了任何问题,那么以后再返回并找到所有需要释放的内存要比一开始就正确操作困难得多
    • 在很多情况下,您确实需要释放内存(以防止在长时间运行的程序中使用大量内存),因此您的默认策略必须是清理几乎所有内容
    不自由的理由似乎有点似是而非:

    • 更少的代码
    • 如果在程序退出之前,有无数块要单独释放,那么让操作系统放弃整个过程可能会快得多
    • 如果你不知道在哪里使用,那么按需创建并存储在globals中的东西可能很难安全清理。设想一种在运行过程中填充的缓存,它可能有MRU规则来限制它占用的内存量,因此它不是无限泄漏。好的,这是一件坏事(不受限制的全局变量)导致了另一件坏事(不受限制的内存),但值得了解的是,为什么您可能会在现有代码中看到不受限制的块,并且您不必直接进入并修复它们

    释放的原因几乎总是大于反对的原因。

    我甚至不会说每个malloc都必须被释放,但我要说的是,无论程序运行多长时间,都必须有一定数量的分配(和总大小)获胜