【发布时间】:2021-09-22 20:20:49
【问题描述】:
给了我一组源代码,我的情况如下:
假设我有一个源文件 (source1.c),其中包含:
static float *var;
void alloc_mem ()
{
var = (float *) malloc(N * sizeof(float));
}
void some_function (float *data)
{
// do something with var and data
}
在主函数中,我有
int main()
{
alloc_mem ();
some_function (data);
}
现在,我无法通过在 main 中调用 free(var) 来释放分配给 var 的内存,因为它不在此范围内。
这种情况会导致内存泄漏吗?如果我在 source1.c 中定义一个函数为
void dealloc_mem()
{
free(var);
}
在 main 的末尾调用它,它会工作吗?
【问题讨论】:
-
会发生内存泄漏吗?是的,如果你调用
alloc_mem()两次,而没有对内存的干预调用free(),无论指针变量的位置和位置如何。 -
是的,您仍然可能有内存泄漏。通常,C 不知道定义了哪些指针或它们如何获取值,无论它们是否为
static。所以你需要自己释放内存(或者等到程序存在,在这种情况下所有东西都被释放(但不是通过调用free))。 -
请注意,如果
alloc_mem()被多次调用,则肯定存在内存泄漏。仅调用一次时,您最终会得到“退出时正在使用的内存”或“仍可访问”的内存,这并不总是被视为内存泄漏。添加释放器意味着您可以更轻松地发现其他泄漏——少了一件需要担心的事情。此外,您可以使用atexit()注册dealloc_mem(),以便在程序退出时调用它(如果您可以使用at_quick_exit(),则可以使用at_quick_exit()— 在C11 中添加)。
标签: c memory-leaks static malloc free