0

私の問題を説明するために、これはミニマリストのmain.ccです。

#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()は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バイトがまだ残っているのか誤解していますが、どこが間違っているのでしょうか。

前もって感謝します :)

編集

Vaughn Cato、DietmarKühl、Richard J. Ross IIIのおかげで、私は次のように変更しました。

output = fgets(tmp_buffer, len, input);
    if ( output != NULL ) {

if ( fgets(output, len, input) != NULL ) {
4

1 に答える 1

7

別のポインターに置き換えoutputたので、割り当てたものと同じものを削除することはありません。

output = fgets(tmp_buffer, len, input);

なぜパラメータread_stdinがあるのか​​わかりません。outputfgetsの結果を確認する必要がある場合は、代わりにローカル変数を使用できます。

inline bool read_stdin(char *tmp_buffer, const size_t &len, FILE *input) {
    char *output = fgets(tmp_buffer, len, input);
    .
    .
    .
}
于 2013-01-04T00:20:50.350 に答える