我碰到下面的函數內存泄漏:內存泄露而沒有調用new
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的字節數(實際的文件,而不是讀取文件的名稱):
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,看看他們是否隱藏了「gotcha's」,他們在哪裏調用new [],但沒有在cplusplus.com的文檔中找到任何內容。我已經嘗試了新的char []/delete [],malloc/free和堆棧分配的變量(上面)的所有不同組合,但每次都得到相同的valgrind消息。有任何想法嗎?謝謝。
'炭的ReadBuf [LEN + 1];'是無效的C++。 –
這是一個非常奇怪的代碼:'char readbuf [len + 1]'。你使用什麼編譯器? –
您應該更改'readbuf [len + 1] ='\ 0';'readbuf [len] ='\ 0';',除非您故意嘗試超出readbuf。另外,你真的在使用C99,而不是C++嗎? –