Я получаю утечку памяти из следующих функций:памяти через новый [] никогда не вызывая новый
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)
Что меня смущает то, я никогда не использовать новый [] в моем коде. Я проверил fopen, ftell и fread, чтобы посмотреть, есть ли у них скрытые «gotcha's», где они называются new [], но ничего не нашли в документации на cplusplus.com. Я пробовал все разные комбинации новых char []/delete [], malloc/free и переменных, связанных с стеками (выше), но каждый раз получаю одно и то же сообщение valgrind. Есть идеи? Благодарю.
'char readbuf [len + 1];' недействителен C++. –
Это очень странный код: 'char readbuf [len + 1]'. Какой компилятор вы используете? –
Возможно, вы должны изменить 'readbuf [len + 1] = '\ 0';' to 'readbuf [len] = '\ 0';', если вы не намеренно пытаетесь перехватить readbuf. Кроме того, вы действительно используете C99, а не C++? –