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

use*_*581 2 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;  
} 
Run Code Online (Sandbox Code Playgroud)

功能上有问题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);

    }
Run Code Online (Sandbox Code Playgroud)

Gri*_*han 6

你不释放内存,动态分配由malloc的jmpbuf=malloc(sizeof(sigjmp_buf)); 添加free(jmpbuf) 之前,return ipHostent; 从功能*timeGethostbyname.

注意你的代码运行一个循环来调用分配内存的函数,并且你不断地分配内存free().

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

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