我有以下代码,这会导致内存泄漏,函数返回后,有很多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);
}
}
答案 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)
在重新指定指针之前,你应该释放它。否则先前分配的内存不再被任何指向(但仍然被分配),因此泄露。