是否必须释放每个malloc调用
据我所知,因为malloc动态分配mem,所以您需要释放该mem,以便它可以再次使用是否必须释放每个malloc调用,c,pointers,malloc,C,Pointers,Malloc,据我所知,因为malloc动态分配mem,所以您需要释放该mem,以便它可以再次使用 如果返回使用malloc创建的char*,会发生什么情况(即,您应该如何释放该char*) 如果指针保持原样 然后退出应用程序,会是吗 我找不到一个明确的答案,有人说是,有人说不是 对。如果你是malloc,你需要自由。如果不释放内存,则保证程序运行时内存泄漏 释放它 总是 句号。是的,每个对的呼叫都必须与对的呼叫相匹配 要回答您的具体问题: 您必须明确记录API,告诉用户返回的指针是否必须是free()'d
对。如果你是malloc,你需要自由。如果不释放内存,则保证程序运行时内存泄漏 释放它 总是 句号。是的,每个对的呼叫都必须与对的呼叫相匹配 要回答您的具体问题:
free()
'dp = func();
//...
free(p);
诀窍在于确保你总是这样做
2) 一般来说,是的。但是你仍然应该释放你作为良好实践使用的任何内存。不花时间找出在哪里释放内存只是懒惰
malloc
创建的内存的指针,使用该指针释放该内存将是正确的。是的,这里面有一些魔力;这将由编译器处理
让我们一次只看一点
char*
,您知道它是用malloc
创建的,那么是的,您有责任释放它。您可以使用free(myCharPtr)
实现这一点如果您自己编写函数:请避免这样做
- 相反,让调用者传递一个缓冲区,让调用者指定缓冲区的大小并将数据复制到该缓冲区中。这样,您就可以从其他不使用相同堆的模块(其他编程语言、不同的C运行时…)中使用您的函数
- 如果出于任何原因不能使用这样的接口,请在函数的文档中指定调用方必须在处理完返回的指针后释放它
- 如果文档说明您必须释放,请执行此操作
- 如果文档说明您不必这样做,那么可能需要调用一些全局清理函数来释放模块的资源
- 如果您尽快释放内存,通常在进程退出之前很长一段时间,您的程序将使用更少的内存总量
- 如果你不释放它,然后你想把你的程序变成另一个程序中的一个例程,这个例程可能被调用了很多次,那么突然你需要的内存是以前的很多倍(内存泄漏)
- 有一些调试工具可以帮助您识别内存泄漏,方法是在程序退出时警告您仍在分配内存。如果有很多故意泄露的垃圾需要涉过,这些并没有多大帮助
- 如果你没有释放它,并且遇到了任何问题,那么以后再返回并找到所有需要释放的内存要比一开始就正确操作困难得多
- 在很多情况下,您确实需要释放内存(以防止在长时间运行的程序中使用大量内存),因此您的默认策略必须是清理几乎所有内容
- 更少的代码
- 如果在程序退出之前,有无数块要单独释放,那么让操作系统放弃整个过程可能会快得多
- 如果你不知道在哪里使用,那么按需创建并存储在globals中的东西可能很难安全清理。设想一种在运行过程中填充的缓存,它可能有MRU规则来限制它占用的内存量,因此它不是无限泄漏。好的,这是一件坏事(不受限制的全局变量)导致了另一件坏事(不受限制的内存),但值得了解的是,为什么您可能会在现有代码中看到不受限制的块,并且您不必直接进入并修复它们
释放的原因几乎总是大于反对的原因。我甚至不会说每个malloc都必须被释放,但我要说的是,无论程序运行多长时间,都必须有一定数量的分配(和总大小)获胜