[英]Can memory leak occur for memory allocated through static variable?
我得到了一组源代码,其中的情况如下:
假设我有一个源文件 (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 的末尾调用它,它会起作用吗?
是的,从技术上讲,这确实是内存泄漏。
实际上,它通常是可以接受的,因为内存可以安全释放的唯一时间是在程序退出时,此时,内存是否被释放并不重要 - 它仍然会被返回程序终止后的操作系统。
为了迂腐,您可以在 main 的末尾free
内存,但是除了从 main 返回之外,还有更多的方法可以终止程序,因此正确的方法是注册退出处理程序。 但这可能是一种矫枉过正。
不得不提一下,从提供的代码来看,一开始为什么需要动态分配是完全不清楚的,所以我没有解决这部分。
是的,这确实会导致内存泄漏。 为了说服自己,您可以使用valgrind
实际检查。 将以下内容放在您的source.c
:
#include <stdlib.h>
static float *var;
void alloc_mem ()
{
int N = 100;
var = (float *) malloc(N * sizeof(float));
}
void dealloc_mem()
{
free(var);
}
void some_function (float *data)
{
// do something with var and data
}
int main()
{
float *data;
alloc_mem ();
some_function (data);
}
现在运行gcc -o executable source.c
然后valgrind --leak-check=yes ./executable
。 这将表明您确实丢失了 400 个字节(在此示例中,100 个浮点数中的每个浮点数为 4 个字节)。 如果你调用dealloc_mem();
正如您在main
结尾所建议的那样,您不会有任何泄漏。
通过静态变量分配的内存会发生内存泄漏吗?
是的,当然,如果您重新分配var
。
现在,我无法通过在 main 中调用
free(var)
来释放分配给 var 的内存,因为它不在那里的范围内。
您可以通过返回var
轻松解决该问题。
如果我在
source1.c
定义一个函数为void dealloc_mem() { free(var); }
并在 main 的末尾调用它,它会起作用吗?
是的,当您不再需要分配的内存时,适当地调用dealloc_mem
会正常工作。
内存分配的通用规则是每个*alloc
都应该有一个free
。
总是释放内存是一个很好的做法,即使在执行结束时,当然当程序结束时,系统会释放内存,但是如果你通过内存检查器运行它,它仍然会抱怨。
除此之外,我没有看到您需要这种构造的情况,也许您可以解释为什么您的代码是这样结构的,否则我们可能会遇到XY 问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.