【问题标题】:malloc pointer cause memory leak?malloc 指针导致内存泄漏?
【发布时间】:2016-08-30 06:45:47
【问题描述】:

我有以下代码,会不会导致内存泄漏,函数返回后,有很多未分配的内存,没有被认领?

#include <stdlib.h>

struct test
{
    char * name;
    char * value;
};

void test_ok()
{
   int i;
   struct test * ok;

   for (i=0;i<10000;i++)
   {
       ok =malloc(sizeof(struct test));
   } 

}
void main ()
{
    int j=0;
    while(j<60)  
    {
      test_ok();
      j++;
      sleep(1);
    }

}

【问题讨论】:

  • test_ok 未被调用....
  • 你的代码没有做任何事情,只是在浪费 CPU 周期。
  • 哎呀,刚刚添加了函数调用。
  • 看来你已经知道答案了。是的,当然它会造成大量内存泄漏。
  • 是什么让您的程序不会造成内存泄漏?你在分配大量内存却从未释放它。

标签: c memory-leaks malloc


【解决方案1】:

在您的代码中,永远不会调用 test_ok(),因此永远不会执行 malloc()。所以不会发生内存分配,也不会有内存泄漏的问题。

无论如何,任何体面的编译器都会优化掉test_ok() 代码。


编辑:

如果你真的从main()调用test_ok(),它最终会调用该函数,通过调用malloc()分配内存[假设malloc成功]并且什么都不做。所以,理论上,是的,你会有很多内存泄漏。

注意点:正如你所说,

[...] 函数返回后 [...]

假设您正在谈论test_ok() 函数,不,简单地从带有malloc 指针的函数返回不会导致内存泄漏。当您在使用完成后错过释放内存(不再引用/使用)时,就会发生泄漏。

当退出程序,从main()返回时,所有分配的内存无论如何都会被释放。程序继续运行时会出现内存泄漏问题。

也就是说,根据最新标准,void main() 不是托管环境的有效签名,您至少应该使用 int main(void)。

【讨论】:

    【解决方案2】:

    你的程序没有调用test_ok(),所以答案是否定的。

    如果调用test_ok(),答案将是肯定的。您正在使用 malloc 在堆上分配内存,而不是之后使用 free 清理它。

    编辑:现在 OP 已被编辑为调用 test_ok(),所以是的,这个程序会泄漏内存。

    【讨论】:

      【解决方案3】:

      除非你真的从main() 中调用test_ok(),否则不会。

      【讨论】:

        【解决方案4】:

        在重新分配指针之前,您应该释放它。否则之前分配的内存不再被任何东西指向(但仍然被分配),因此泄漏。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-23
          • 2021-06-14
          • 1970-01-01
          • 2014-05-10
          • 2012-08-10
          • 2016-10-23
          • 2023-03-06
          相关资源
          最近更新 更多