2010-12-08 7 views
1
void *do_chld(void *arg) 
{ 
    char *sub; 
    sub = malloc(255 * sizeof(char)); 

    /* 
     ------ Some Code ---- 
    */ 

    free(sub); 
    pthread_exit((void *)0); 
} 

上記の関数はpthreadsに渡されます。プログラムが実行されると、私はセグメンテーションフォールトを取得します。私がfree(sub)への呼び出しにコメントすると、私のコードは正常に動作します。なぜ私は理解できませんか?スレッド内のメモリを動的に解放しますか?ヒープはメインスレッドに関連付けられたすべてのピアスレッドで共有されるためです。あなたが/* -- Some Code -- */せずにプログラムを実行しようとした -pthredによって実行された関数を使用してヒープ割り当て領域を解放すると、セグメンテーションフォールトをスローする

編集の1-フルコード

void *do_chld(void *arg) 
{ 

    int  new_fd = (int) arg; 
    int  i,n,val; 
    char buf[255]; 
    char *sub; 


    sub = malloc(255 * sizeof(char)); 

    printf("Child thread [%d]: Socket number = %d\n", pthread_self(), new_fd); 

    /* read from the given socket */ 
    n = read(new_fd,buf,100); 
    if(n<0){ 
      fprintf(stderr,"Receieving Failed\n"); 
      exit(2); 
    } 
    //process 
    printf("Received %s \n",buf); 

    val = checkSpelling(buf) ; 
    if(val){ 
     sub = "Correct Spelling"; 
    } 
    else{ 
     sub = "InCorrect Spelling"; 

    } 
    n = 0 ; 

    n = write(new_fd,sub,strlen(sub)); 
    if(n<0){ 
     fprintf(stderr,"Sending Failed\n"); 
     exit(2); 
    } 


    /* close the socket and exit this thread*/ 
    close(new_fd); 
     free(sub); 
    pthread_exit((void *)0); 
} 

答えて

3

subポインターに文字列リテラル( "綴りを修正する"/"Incorect"の文字列)を割り当ててから、free()で解放しようとしています。文字列リテラルはコード内で静的に割り当てられ、解放することはできません。

コール時のsubポインタは、malloc()で割り当てられていないものを指しています。

は私が主な問題は、しかし、あなたはおそらく文字列の内容は、あなたが malloc()からもらった領域にあるように、 をコピーした文字列をしたいときに、ポインタ代入を実行することだと思います。

EDIT:

あなたがstrcpy()strdup()機能を見てしたいことがあります。あなたの代わりにstrncpy()に慣れた方が良いかもしれませんが、strcpy()は問題ありません。

strdup()はおおよそstrlen() + malloc() + strcpy()の組み合わせで、ヒープメモリ領域に文字列のコピーを格納したい場合は、通常はfree()で解放することができます。

EDIT 2:あなたのコードで

は、あなただけの応答メッセージのsubバッファを使用し、それを解放する上。これがコードの最終的な動作になる場合は、malloc()free()の呼び出しを削除するだけで問題ありません。

2

は、これは私には、ヒープの破損のように聞こえますか?

表示されているコードは正常に見えますが、表示されていないコードが割り当てられたメモリの外でヒープの一部を上書きしている可能性があります。これは、メモリが破損していて、プロセスが終了したときにエラーを起こさない場所でエラーが発生していない可能性がありますが、割り当てられたメモリを記述するデータ構造を非常に簡単に変更することができます。 freeが失敗します。

アップデート: - おそらくbufの終わりを過ぎて書き込むことによってそれは実際にあなたが不注意subポインタ(別称、スタック破損)の値を変更していることが考えられ掲示2番目のコードを見てみます。これにより、ほぼ確実にfreeが失敗します。

mallocコール直後のsubの値を確認してから、freeの直前にもう一度値が変更されていないことを確認してください。

更新2:スクラッチ - thkala正しい答えがあります。

+0

私は/ * ---いくつかのコード - * /内のヒープにアクセスしていないと確信しています。私は参照のために同じを転記しています。 –

+0

@Eternal - 代わりに、 'sub'の値が変更されている可能性があります。詳細は、最新の記事を参照してください。 – Justin

0

malloc()の結果のアドレスである 'sub'が参照を失ったためです。最初は、 'sub'はmalloc()の結果の先頭アドレスを指していました。しかし、あなたが「サブスクリプションを修正する」ようにすると、「サブ」はmalloc()のメモリを指しませんでした。それはその文字列の先頭アドレスになりました - "Corr--" - 。 'sub'を使用してmalloc()メモリを解放しようとすると、 'sub'はmalloc()されたアドレスを指すことができず、文字列(char arrary)を解放することができないので、 。

あなたは、そのサブがポインタ値の1つであり、メモリ自体ではないことを忘れないでください。

関連する問題