サンプル コードを使用して libuv について学習すると、よくわからない副作用に遭遇しました。コードは malloc() を使用してメモリを取得し、ネットワーク上のクライアントからデータを保存してから、同じデータを送り返します。次に free を使用してメモリを解放します。これは、コールバック ループを通じて何度も繰り返されます。メモリを取得するコード行は次のとおりです。
uv_write_t *req = (uv_write_t *) malloc(sizeof(uv_write_t));
メモリを解放する行は次のとおりです。
free((char*) req->data);
free(req);
ただし、「Whats the word on the street?」のような長い文字列を入力すると、エコーされてから、短い文字列がエコーバックされた後、古い文字列の「Hi」フラグメントのような短い文字列が再び表示されます。たとえば、出力は次のようになります。
通りの言葉は何ですか?こんにちは、こんにちは、こんにちは。
メモリが解放されているため、古いフラグメントが再び表示される理由がわかりません。この件に関する私の考えは、malloc と free() について理解できないことがあるか、ライブラリにバグがあり、受信データに必要なサイズを決定する方法があり、長い文字列を使用した後に得られるということです。大きすぎたメモリブロックの一部としてガベージ。もしそうなら、それが私の以前の入力の断片であるという事実は単なる偶然です. これが考えられる理由ですか、それとも何か不足していますか? 他の情報はありますか。それを明確にするために含めるべきですか?