我有一个for循环的函数,在循环内部(取决于输入)使用malloc()
初始化一次(第一次)某些变量。
这些变量是这样声明的:
static double *vector;
malloc(size*sizeof(double));
问题是:
是否必须在被调用函数内部的最后一次循环迭代中释放这些变量?
更新:也许我对某些人解释错了。问题是被调用函数(func_A)根据主函数的输入为它使用的某些向量分配内存。然后,这个func_A在main函数的循环中被调用几次。这就是为什么我将变量定义为静态的原因,这样就不会在每次调用func_A时都定义它们(出于时间消耗问题),因为维度在整个运行过程中不会改变。这些变量是静态的,但不是全局的,所以我不能把它们从主目录中解放出来(对吧?)
您应该始终平衡malloc
与free
的调用。
在您的情况下,当您知道您不再需要vector
时,您可以调用它。
如果这是不实际的,那么你总是可以调用atexit
;传递给它一个指向合适函数的指针,该函数将free
内存。见http://www.tutorialspoint.com/c_standard_library/c_function_atexit.htm
尽管您通常可以依赖操作系统来为您清理程序终止,但依赖它是相当粗糙的。
当数据不再使用时,每个malloc调用都需要有相应的free调用
你需要释放指针。作为一个经验法则——你用malloc/new分配的所有东西都在堆上,需要被释放/删除——其他所有东西都在堆栈上,并且不
注。如果您只使用诸如java/go/python之类的垃圾收集语言,则不需要了解这些
似乎向量只分配一次,然后在程序的生命周期内使用。向量存储在静态变量中。在终止程序之前,最好先释放vector,但终止程序也会为您做这些。
听起来,在程序的生命周期内,该函数似乎没有准备好处理不同(特别是:较大)的向量大小。
你我是否必须在被调用函数内部的最后一次循环迭代中释放这些变量?
,但你不需要。
当你不再需要内存分配器函数分配的内存时,你只需要 free()
。
malloc()
和family分配内存的主要目的之一是克服局部变量范围的限制(从函数返回的局部变量的地址是非法的),所以你不必必须 free()
内存"在被调用的函数内部"。您可以很好地将指针(由malloc()
返回)返回给调用者,对该指针(内存)执行一些其他操作,然后从子函数的调用者那里清理(free()
)指针。
要记住的一件事是,您需要将最初由malloc()
或family返回的确切指针传递给free()
。