malloc指针导致内存泄漏?

时间:2016-08-30 06:45:47

标签: c memory-leaks malloc

我有以下代码,这会导致内存泄漏,函数返回后,有很多mallocated内存,没有声明?

#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);
    }

}

4 个答案:

答案 0 :(得分:3)

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

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

编辑:

如果您实际从test_ok()调用main(),它最终将调用该函数,通过调用malloc() [提供的malloc成功]来分配内存并且什么都不做。所以,从理论上讲,是的,那里你会有内存泄漏,很多。

注意事项:如你所说,

  

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

之后

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

退出程序时,从main()返回,所有分配的内存将被取消分配。当程序继续运行时,会出现由于内存泄漏引起的问题。

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

答案 1 :(得分:2)

你的节目没有拨打test_ok(),所以答案是否定的。

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

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

答案 2 :(得分:1)

除非您实际从test_ok()内拨打main()

答案 3 :(得分:1)

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