繁体   English   中英

通过静态变量分配的内存会发生内存泄漏吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM