0

次の関数からメモリ リークが発生しています。

int ReadWrite(int socket, char *readfile) {
  FILE *rf = NULL;
  rf = fopen(readfile, "rb");
  fseek(rf, 0, SEEK_END);
  int len = ftell(rf);
  rewind(rf);

  char readbuf[len + 1];

  int res = fread(readbuf, len, 1, rf);
  readbuf[len + 1] = '\0';
  fclose(rf);
  while (1) {
    int wres = write(socket, readbuf, res);
    if (wres == 0) {
      cerr << "socket closed prematurely" << endl;
      close(socket);
      return EXIT_FAILURE;
    }
    if (res == -1) {
      if (errno == EINTR)
        continue;
      cerr << "socket write failure: " << strerror(errno) << endl;
      close(socket);
      return EXIT_FAILURE;
    }
    break;
  }
  return EXIT_SUCCESS;
}

Valgrind は、この操作によって readfile (readfile の名前ではなく、実際のファイル) にあるバイト数を漏らしたことを教えてくれます。

Address 0x4c3b67e is 0 bytes after a block of size 14 alloc'd
at 0x4A07C84: operator new[](unsigned long) (vg_replace_malloc.c:363)

私を混乱させているのは、コードで new[] を使用したことがないことです。fopen、ftell、および fread を調べて、どこかに new[] を呼び出す "落とし穴" が隠されているかどうかを確認しましたが、cplusplus.com のドキュメントには何も見つかりませんでした。new char[]/delete[]、malloc/free、およびスタック割り当て変数 (上記) のさまざまな組み合わせをすべて試しましたが、毎回同じ valgrind メッセージが表示されます。何か案は?ありがとう。

4

3 に答える 3

7

あなたが呼ぶ

  • char readbuf[len + 1];

    そしてその後

  • readbuf[len + 1] = '\0';

それは配列をオーバーフローしませんか?

于 2013-05-29T22:12:38.813 に答える