我 "have to" free() 静态动态分配的指针吗?

Do I "have to" free() static dynamically allocated pointers?

我有一个带有 for 循环的函数,在循环内部(并且取决于输入)某些变量使用 malloc().

初始化一次(第一次)

这些变量声明如下:

static double *vector;

然后我使用

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

问题是:

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

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

Do I have to free these variables in the last iteration of the loop inside the called function or not?

可以,但你不必

您只需要free()当您不再需要内存分配器函数分配的内存。

使用malloc()和家族进行内存分配的主要目的之一是克服局部变量作用域的限制(return函数中局部变量的地址是非法的),所以你永远不必free()内存"inside the called function"。您可以很好地 return 指向调用者的指针(return 由 malloc() 编辑),使用该指针(内存)执行一些其他操作,然后清理(free() ) 来自子函数调用者的指针。

不过要记住一件事,您需要将确切的指针传递给 free(),它最初是由 malloc() 或家人 return 编辑的。

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

您需要释放指针。 作为一个经验法则——你用 malloc/new 分配的所有东西都在堆上并且需要是免费的'd/deleted 其他所有东西都在堆栈上而不是

p.s。如果您只使用诸如 java/go/python 之类的 grbage 收集语言,则无需了解这些

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

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

您应该始终 平衡 malloc 与调用 free

在您的情况下,当您知道不再需要 vector.

时,您 可以 调用它

如果那不切实际,那么您可以随时致电 atexit;向它传递一个指向合适函数的指针,该函数将 free 内存。参见 http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm

虽然您通常可以依靠操作系统在程序终止时为您清理,但依靠它是相当粗鲁的。