我是否必须" free()静态动态分配指针?

时间:2016-09-08 07:57:28

标签: c malloc free dynamic-memory-allocation

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

这些变量声明如下:

static double *vector;

然后我使用

分配内存
malloc(size*sizeof(double));

问题是:

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

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

5 个答案:

答案 0 :(得分:3)

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

在您的情况下,当您知道不再需要vector时,可以调用它。

如果这不实用,那么您可以随时拨打atexit;向它传递指向合适函数的指针,该函数将free内存。见http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm

虽然您可以经常依赖操作系统在程序终止时为您清理,但依赖它可能相当粗糙。

答案 1 :(得分:0)

  

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

可以,但 不必

只有必须 free()当您不再需要内存分配器功能时分配的内存。

使用malloc()和系列进行内存分配的主要目的之一是克服局部变量范围的限制(从函数返回局部变量的地址是非法的),所以你永远不会 free()内存"在被叫函数" 中。你可以很好地将指针(由malloc()返回)返回给调用者,用该指针(内存)执行一些其他操作,然后清理(free())来自子调用者的指针-function。

要记住的一件事是,您需要将确切的指针传递给最初由free()或其家人返回的malloc()

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你需要释放指针。 作为经验法则 - 您使用malloc / new分配的所有内容都在堆上,需要自由删除/删除堆栈中的其他所有内容并且不会

P.S。如果您只使用垃圾收集语言,例如java / go / python,您将不需要知道任何此类

答案 4 :(得分:0)

似乎矢量被分配一次,然后在prorgam的生命周期中使用。向量存储在静态变量中。在终止程序之前,释放向量是个好主意,但终止也会为你做。

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