2

メモリリークが発生しました。コードの何が問題になっていますか?

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何度も呼び出すと、メモリリークが発生します。元:

   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

jmpbuf=malloc(sizeof(sigjmp_buf)); malloc 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

static sigjmp_buf jmpbuf=NULL;あなたは最初にする必要がありますstatic sigjmp_buf *jmpbuf=NULL;

そして、割り当てられたメモリを処理したら、free割り当てたものは何でも。malloc

この場合、ヒープの代わりにグローバルスコープ(データ領域)に割り当てられたメモリを使用して使用する場合は malloc、必要ないと思います。sigjmp_bufsigjmp_buf jmpbuf=NULL;

于 2013-07-26T07:17:44.873 に答える
1

jmpbuf は、次の宣言と定義によって既に割り当てられているため、メモリを割り当てる必要はありません。

static sigjmp_buf jmpbuf=NULL;
于 2013-07-26T07:19:28.553 に答える
0

これは、malloc によって割り当てられたメモリを解放していないためです。malloc によるすべての割り当ては、使用後に解放する必要があります。そうしないと、メモリ リークが発生します。

于 2013-07-26T07:15:13.450 に答える