C 我会吗;必须;free()静态动态分配指针?

C 我会吗;必须;free()静态动态分配指针?,c,malloc,free,dynamic-memory-allocation,C,Malloc,Free,Dynamic Memory Allocation,我有一个带有for循环的函数,在循环内部(取决于输入),某些变量使用malloc()初始化一次(第一次) 这些变量的声明如下: 静态双*向量 然后我使用 malloc(size*sizeof(double)); 问题是: 我是否必须在被调用函数内循环的最后一次迭代中释放这些变量 更新:也许我对某些人解释错了。问题是被调用函数(func_A)根据主函数的输入为它使用的某些向量分配内存。然后,这个func_A从main中的一个循环调用了几次。这就是为什么我将变量定义为静态变量,这样就不会在每次调用

我有一个带有for循环的函数,在循环内部(取决于输入),某些变量使用
malloc()
初始化一次(第一次)

这些变量的声明如下:

静态双*向量

然后我使用

malloc(size*sizeof(double));
问题是:

我是否必须在被调用函数内循环的最后一次迭代中释放这些变量

更新:也许我对某些人解释错了。问题是被调用函数(func_A)根据主函数的输入为它使用的某些向量分配内存。然后,这个func_A从main中的一个循环调用了几次。这就是为什么我将变量定义为静态变量,这样就不会在每次调用func_A时定义它们(这是时间消耗的问题),因为在整个运行过程中维度不会改变。这些变量是静态的,但不是全局的,所以我不能将它们从主变量中释放出来(对吗?)

我是否必须在被调用函数内循环的最后一次迭代中释放这些变量

你可以,但你不必

当不再需要内存分配器函数分配的内存时,您只需释放它

使用
malloc()
和family进行内存分配的主要目的之一是克服局部变量范围的限制(从函数返回局部变量的地址是非法的),因此您永远不必在被调用函数中释放内存。您可以很好地将指针(由
malloc()
返回)返回给调用方,使用该指针(内存)执行一些其他操作,然后从子函数的调用方清除(
free()
)指针


但是需要记住的一点是,您需要将准确的指针传递给
free()
,该指针最初由
malloc()
或family返回。

当不再使用数据时,每个malloc调用都需要相应的free调用。

您需要释放指针。 根据经验,使用malloc/new分配的所有内容都在堆上,需要释放/删除。其他所有内容都在堆栈上,不在堆栈中


p、 如果你只使用一种grbage收集的语言,比如java/go/python,你就不需要知道任何这方面的知识,它似乎只分配了一次向量,然后在prorgam的生命周期内使用。向量存储在静态变量中。在终止程序之前,释放向量是一个好主意,但是终止也会为您这样做

听起来函数在程序的生命周期内不准备使用不同的(特别是:更大的)向量大小。

您应该始终通过调用
free
来平衡
malloc

在您的例子中,当您知道不再需要
向量时,可以调用它


如果这不实用,那么您可以随时调用
atexit
;将指向适当函数的指针传递给它,该函数将
释放
内存。看


虽然您通常可以依靠操作系统来清理程序终止,但依赖操作系统是相当粗糙的。

答案是“这取决于”。您必须在上次使用内存后和程序退出之前释放内存…当您不再需要它时,您应该释放内存。永远,永远不要调用
free(3)
,因为您没有使用
malloc(3)
。请看手册页面。顺便说一句,如果您在循环的最后一次迭代中释放了变量,那么首先让它们成为
静态的
有什么意义呢?先生,如果我可以问一下,调用
free()
或在
atexit()
中的等效项有什么意义?无论如何,在程序终止后,内存将被回收,对吗?一个漂亮的闪亮的操作系统确实会为您做到这一点,但从C标准的角度来看,这并不能保证会发生。写得好的软件总是会自我清理。“你可以随时调用
atexit
…”呃,不一定。使用atexit注册的回调数量是有限制的,因此直接使用它不能很好地扩展。(为了克服这个限制,可以创建自己的回调注册系统,并使用一个
atexit
回调触发它。)不,这是一种很好的编程风格,但不是强迫你去做的事情。实际上,我们需要的是永远不要调用
free(3)
来处理你没有通过
malloc(3)
获得的东西,或者你已经
free(3)
d的东西。是的,但是他会被限制在他能做的事情上。@ytpillai-你是什么意思?Java/Go/Python抽象的东西,需要没有普遍安装的编译器。尤其是C语言,几乎在任何地方都被使用,尤其是嵌入式硬件。更好的方法是使用编译成C代码的东西,然后将该代码放入所使用系统的编译器中,但编译器必须与系统编译器使用的任何标准兼容