我有一个带for循环的函数和循环内部(并且取决于输入)某些变量使用malloc()
初始化一次(第一次)。
这些变量声明如下:
static double *vector;
然后我使用
分配内存malloc(size*sizeof(double));
问题是:
我是否必须在被调用函数内的循环的最后一次迭代中释放这些变量?
更新:也许我为某些人解释错了。事情是被调用的函数(func_A)根据主函数的输入为它使用的某些向量分配内存。然后,从main中的循环中多次调用此func_A。这就是我将变量定义为静态的原因,因此每次调用func_A时都不会定义它们(因为时间消耗),因为维度在整个运行过程中不会改变。变量是静态的但不是全局变量,所以我无法将它们从主体中释放出来(对吧?)。
答案 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的生命周期中使用。向量存储在静态变量中。在终止程序之前,释放向量是个好主意,但终止也会为你做。
听起来这个函数不准备在程序的生命周期中使用不同的(特别是:更大的)矢量大小。