0

C でスレッドを操作しようとしていますが、これがスレッド関数である場合、ポインターの解放に問題があります。

void *executor_func(void *param) {
char *lineEx = (char *) malloc (1024);

size_t lenEx = 1024;
ssize_t readEx;

FILE * fpEx;
char* pchEx;

fpEx = fopen(file, "r");

if (fpEx == NULL) {
    printf("ERROR: couldnt open file\n");
    exit(0);
}

while ((readEx = getline(&lineEx, &lenEx, fpEx)) != -1) {
    pchEx = strtok(lineEx, " ");

        //DO MY STUFF WITH THE LINE I RECEIVE FROM FILE
    }
free(lineEx);
fclose(fpEx);

return NULL;

 }

executor_func() の複数のスレッドを実行すると想像してください... free(lineEX) が Valgrind で問題を引き起こしています...なぜですか?

4

1 に答える 1

1

これはドキュメントからのものです: http://man7.org/linux/man-pages/man3/strtok.3.html

strtok() 関数は、文字列を一連のトークンに解析します。strtok() の最初の呼び出しでは、解析する文字列を str で指定する必要があります。同じ文字列を解析する必要がある後続の各呼び出しでは、str は NULL である必要があります。

strtok のマニュアルにあるように: これらの関数を使用するときは注意してください。それらを使用する場合は、次の点に注意してください。

   * These functions modify their first argument.

   * These functions cannot be used on constant strings.

   * The identity of the delimiting byte is lost.

   * The strtok() function uses a static buffer while parsing, so it's not
     thread safe.  Use strtok_r() if this matters to you.

不正な解放を取得した場合、これに関連している可能性があります ( Valgrid マニュアルから): ヒープ ブロックの開始を指していないポインターを解放しようとすると、このメッセージも表示されます。Memcheck は、割り当てられたブロックを追跡します。プログラムによって malloc/new を使用して、free/delete の引数が正当かどうかを正確に知ることができます。ここで、このテスト プログラムは同じブロックを 2 回解放しています。不正な読み取り/書き込みエラーと同様に、Memcheck は解放されたアドレスを理解しようとします。このように、アドレスが以前に解放されたものである場合は、同じブロックの重複した解放を簡単に見つけられるように、そのことが通知されます。

そして最後にこれを見てください: strtok 関数のスレッドセーフ strtok_r() を試すことができます

于 2013-04-11T20:37:47.563 に答える