2

Memory leakage happened. What's wrong with the code?

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

something wrong in function timeGethostbyname. if I call the function timeGethostbyname many times.Memory leakage will be happened. 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

4 回答 4

6

您不会释放由 malloc jmpbuf=malloc(sizeof(sigjmp_buf)); Add free(jmpbuf) before return ipHostent; from function动态分配的内存*timeGethostbyname

请注意,您的代码运行一个循环来调用分配了内存的函数,并且您在没有free().

请记住,在 C 中,当对象超出范围时,我们没有自动管理内存(空闲)的垃圾收集器——在 C 中,您必须显式释放内存。使用free()功能。因此,即使您将jmpbuf局部变量设为函数timeGethostbyname(),您也需要在返回之前释放/释放内存,否则它将保持分配给您的进程(当您在新函数调用中丢失内存地址时——内存泄漏)。

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

于 2013-07-26T07:15:34.807 回答
1

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

static sigjmp_buf jmpbuf=NULL;
于 2013-07-26T07:19:28.553 回答
1

你需要先static sigjmp_buf jmpbuf=NULL;使static sigjmp_buf *jmpbuf=NULL;

然后,一旦您完成分配的内存,free您分配的任何内容。malloc

malloc在这种情况下,我认为您不需sigjmp_buf要这样做 sigjmp_buf jmpbuf=NULL;并使用在全局范围(数据区域)中分配的内存,而不是堆。

于 2013-07-26T07:17:44.873 回答
0

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

于 2013-07-26T07:15:13.450 回答