解釋我的問題,這是極簡main.cc:使用delete []但字節肯定丟失了,爲什麼?
#include "./main.h"
int main(int argc, char *argv[]) {
char *buffer = new char[12];
char *output = new char[12];
FILE *input = fopen("file.test", "r");
while (read_stdin(buffer, 12, input, output)) {
// Operations on output
// (...)
}
fclose(input);
delete[] output; output = 0;
delete[] buffer; buffer = 0;
return 0;
}
而且main.h:
#include <cstdio>
#include <cstring>
inline bool read_stdin(char *tmp_buffer, const size_t &len, FILE *input, char *&output) {
output = fgets(tmp_buffer, len, input);
if (output != NULL) {
char *lf = strchr(output, '\n');
if (lf != NULL) {
*lf = '\0';
}
return true;
}
return false;
}
功能read_stdin()可以從標準輸入讀,它解釋了它的名字。
好,預期所有的工作,但是的valgrind告訴我的東西,如:
==6915== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==6915== at 0x4C29527: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6915== by 0x4008A2: main (main.cc:6)
我編譯爲g++ -O0 -g main.cc -o test
據我瞭解,這12個字節爲「輸出」,但爲什麼會出現一些字節丟失?我使用delete [],即使STDIN或輸入中沒有任何內容,輸出也會是NULL嗎?
我誤解爲什麼仍然有這12個字節,我錯在哪裏?
預先感謝您:)
編輯
由於沃恩卡託,迪特馬爾·庫爾和理查德·羅斯III,我改線:
output = fgets(tmp_buffer, len, input);
if (output != NULL) {
到
if (fgets(output, len, input) != NULL) {
可能是一個valgrind錯誤,但你的代碼看起來是正確的。 –