2011-07-20 34 views
1

私はC言語で2つのスレッドを実行していますが、両方ともいくつかの操作をしています。どちらのスレッドも無限ループを含んでいます。このプログラムを何回か実行すると、常にメモリリークエラーが発生します。free()のメモリエラー

*** glibc detected *** ./a.out: free(): invalid next size (normal): 0x08652510 ***

======= Backtrace: =========

/lib/libc.so.6(+0x6c501)[0x3d1501]

...

私はそれがメモリエラーであると信じて、問題は、私は常に(原因イムはまだそれをテストし、そのプログラムを停止する必要がある場合には、 )、私はちょうどCtrl+Cとプログラムを終了するので、私はいつもfree(anything)コマンドを逃すと信じていますまたは。

このような状況を回避する方法を教えてもらえますか?だから私はプログラムを終了する場合でも、free()メモリができますか?私の心にされています

次の事、私は、数分待ってからもう一度プログラムを実行すると、それはすべてのヒントについて

おかげ

void *lineOne(void *dataO) 
{ 
    struct IPlist *IPlist = dataO; 

    static struct ARP_entryI ARP_tableI[ARP_TABLE_SIZE]; 
    int neigh=0; //pocet susedov 
    int neigh1=0; //stav pred tym 
    int i; 

    getAddress(); 

    while(1) 
    { 
    while (neigh == neigh1) 
    { 
     neigh =rcvBroad(IPlist, neigh); 
    } 

    neigh1=neigh; 

    for (i=neigh ; i<neigh+1; i++) 
    { 
     main_client(ARP_tableI, IPlist[i-1].IPaddr); // vysle tcp, prijme arp 
     getAddress(); 
    } 
    } 

} 

//pocuvaServer, odpoveda ARP 
void *lineTwo() 
{ 
    static struct ARP_entryO ARP_tableO[ARP_TABLE_SIZE]; 
    int line = from_local_arp(ARP_tableO); 

    main_server(ARP_tableO, line); // pocuva tcp, vysle arp 

} 


void main() 
{ 
    static struct IPlist *IPlist[ARP_TABLE_SIZE]; 

    pthread_t thread1, thread2; 
    int iret1, iret2; 

    /* Create independent threads each of which will execute function */ 

    iret1 = pthread_create(&thread1, NULL, lineOne, (void *)IPlist); //(void *) & 
    iret2 = pthread_create(&thread2, NULL, lineTwo, NULL); 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 


} 
+1

コードの少なくとも一部を投稿してください。 – cnicutar

+0

*関連コードを投稿することもできます。ところで、アプリを終了すると、ほとんどのオペレーティングシステム(Mac OS XやLinuxを含む)では、すべてのメモリが解放されます。 –

+0

プログラムを終了すると、OSは割り当てられたリソースを自動的に解放します。 OSが非常に壊れていない限り、非常に壊れています。このケースを処理することについて心配する必要はありません。 – aroth

答えて

3

あなたはSIGINTを扱うことができますが、それは問題ではありません。あなたのコードは、あなたがその余分な呼び出しをしたいときにすでにメモリを壊しています。free()呼び出し。

-gでコンパイルし、valgrindで実行してください。

1

は、シグナルハンドラを使用し完全に再実行されますCtrl-Cイベント(Ctrl-CはSIGINT信号を生成する)をキャッチし、ハンドラにフラグを設定します。無限ループを変更して、フラグが見えるときにループを停止し、ループの後にクリーンアップコードを記述します。あなたのプログラムは「正常に」終了します。

シグナル処理関数はGNU Cライブラリ(およびPOSIXシステムのいずれかと思われます)の一部です。 hereは、シグナル処理に関するGNU Cライブラリのドキュメントへのリンクです。

+0

は、シグナルハンドリングメカニズムのより完全な説明を指すリンクを編集しました。 –

1

Valgrindでプログラムを実行し、メモリ割り当て構造が破損している場所について助けを得ることができるかどうかを確認してください。このエラーから、あなたがどこかでメモリ割り当てで何か無効なことをしているように見えると、メモリ割り当てのために内部データ構造が壊れてしまいます。

0

ヒープスペースが壊れています。おそらく、割り当てられたメモリのチャンクの終わり(または最初の前)を書き留めているかもしれません。フリーソフトウェアは、破損を検出してエラーを生成しています。

プログラムが終了すると、すべてのメモリが自動的に解放されます。