2013-01-04 65 views
0

解釋我的問題,這是極簡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) { 
+0

可能是一個valgrind錯誤,但你的代碼看起來是正確的。 –

回答

7

您已更換output用不同的指針,這樣你就不會刪除您分配了相同的事情:我不知道爲什麼read_stdinoutput參數

output = fgets(tmp_buffer, len, input); 

。如果你只需要檢查fgets的結果,那麼你可以使用本地變量:

inline bool read_stdin(char *tmp_buffer, const size_t &len, FILE *input) { 
    char *output = fgets(tmp_buffer, len, input); 
    . 
    . 
    . 
} 
+0

不,'fgets'返回成功時傳入的指針。 –

+1

@ RichardJ.RossIII它沒有通過相同的指針,是嗎? –

+0

我的錯誤是'read_stdin(...,char *&output)'的原型? –

相關問題