导致此内存泄漏的原因是什么?

时间:2013-07-26 07:12:52

标签: c linux memory-leaks

发生内存泄漏。代码有什么问题?

static sigjmp_buf jmpbuf=NULL;

static void alarm_func()  
{  
   siglongjmp(jmpbuf, 1);  
}  
static struct hostent *timeGethostbyname(const char *domain, int timeout)  
{  
    struct hostent *ipHostent = NULL;  
    jmpbuf=malloc(sizeof(sigjmp_buf));
    signal(SIGALRM, alarm_func);  
    if(sigsetjmp(jmpbuf, 1) != 0)  
    {  
        alarm(0);
        signal(SIGALRM, SIG_IGN);  
        return NULL;  
    }  
    alarm(timeout);//setting alarm  
    ipHostent = gethostbyname(domain);  
    signal(SIGALRM, SIG_IGN);  
    return ipHostent;  
} 

函数timeGethostbyname中的错误。  如果我多次调用函数timeGethostbyname。将发生内存泄漏。  EX:

   int main(int argc, char **argv ){
        char *servers="www.aaa.bbb.tt";
        struct hostent *h;
        while(1){
            h=timeGethostbyname(servers, 2);
        }

        return(0);

    }

4 个答案:

答案 0 :(得分:6)

您不释放内存,由malloc jmpbuf=malloc(sizeof(sigjmp_buf));动态分配 在功能free(jmpbuf)的{​​{1}}之前添加return ipHostent;

请注意,您的代码会运行一个循环来调用分配了内存的函数,并且您在不使用*timeGethostbyname的情况下不断分配内存。

请记住,在C中,当对象超出范围时,我们没有自动管理内存(免费)的垃圾收集器---在C中,您必须显式释放内存。使用free()函数。所以即使你在函数free()本地变量jmpbuf你需要在返回之前释放/释放内存,否则它将保持分配给你的进程(当你丢失新函数调用中的内存地址时 - -内存泄漏)。

除了内存泄漏之外,您必须在代码中收到错误/警告,因为您将timeGethostbyname()声明为jmpbuf的值变量而不是指针。要么将其声明为static sigjmp_buf类型,要么甚至不需要为它分配内存。

答案 1 :(得分:1)

您需要先static sigjmp_buf jmpbuf=NULL;static sigjmp_buf *jmpbuf=NULL;

然后free完成分配的内存后malloc分配的任何内容。

在这种情况下,如果你执行malloc,我认为你不需要sigjmp_buf sigjmp_buf jmpbuf=NULL;并使用在全局范围(数据区域)中分配的内存,而不是堆。 / p>

答案 2 :(得分:1)

没有必要为jmpbuf分配内存,因为它已经通过以下声明和定义分配:

static sigjmp_buf jmpbuf=NULL;

答案 3 :(得分:0)

那是因为你没有释放malloc分配的内存。应该在使用后释放malloc的所有分配,否则会出现内存泄漏。