-1

すみません、ポインターを 2 回 free() すべきではないことはわかっていますが、まだ解放されていないかどうかを確認するにはどうすればよいですか? nullかどうかを確認しますか?free() コマンドはメモリに null を書き込まず、単にスペースを解放するだけだと誰かが私に言ったので、私は知りません! ヘルプ !!どうもありがとう !

void buffer_destroy(buffer_t* buffer){
        if(buffer==NULL){
            return ;
        }

        int i;
        if(buffer->size>0){


        for(i=0;i<buffer->size;i++){
            msg_destroy_string(buffer->array_msg[i]);

        }

        }
        free(buffer->array_msg);
        free(buffer);

実際には、関数を起動し、「バッファ」と呼ばれるポインタを引数として取るbuffer.caスレッドがあります。次に、このスレッドでpthread_joinを呼び出しますが、起動時にすべての引数が自動的に渡されるかどうかはわかりません(この場合、これ"buffer" と呼ばれるポインタ) は free() になります。2 番目の瞬間に double free() 呼び出しでエラー/例外が発生したため、引数として "buffer" を使用したため、スレッドの最後で最初の free が自動的に呼び出された可能性があります。

4

1 に答える 1

0

トニーが言ったように、おそらくあなたの論理には穴があります。最良の答えは、コードを作り直すことです。

私は C の専門家ではありませんが、何らかの理由でコードを変更できない場合は、次のことを試してください:
- 変数 " hasBeenFree = FALSE " を追加します (おそらくグローバル変数またはパラメーターを関数)
- freeを呼び出す前にテストします。

if (!hasBeenFree) {
   free(buffer);
   hasBeenFree = TRUE;
}

でも、経験者の方が答えてくださると幸いです。

なぜ「cunit」とタグ付けするのですか?

于 2014-02-14T02:05:58.700 に答える