2

このコードを実行すると、Valgrind からこのメッセージが表示されます。c++ と Linux は初めてですが、修正する必要があることはわかっています。何が悪いのか教えてください。私はUbuntuを使用しています。

メッセージは次のとおりです。

==29304== Thread 1:
==29304== 72 bytes in 18 blocks are definitely lost in loss record 55 of 89
==29304==    at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==29304==    by 0x4032BBC: GmpPipePlayer::GmpPipePlayer(IOBase*, Referee*, unsigned char, int, DataBoard const*, int, char const*, int) (unixgmppipe.cpp:126)
==29304==    by 0x40329F9: GmpPipePlayer::CreateFunc(IOBase*, Referee*, unsigned char, int, DataBoard const*, void*) (unixgmppipe.cpp:55)

コードは次のとおりです: int down[2], up[2];

pipe(down);   
pipe(up);

_pid = fork();

if (_pid < 0)
    exit(1);


if (_pid == 0)
{
    close(down[1]);
    close(up[0]);

    dup2(down[0], 0);
    dup2(up[1], 1);

    execl("/bin/sh", "sh", "-c", cmd_line, NULL);

    _exit(1);
}

close(down[0]);
close(up[1]);
_down = down[1];
_up = up[0];

_reader_thd = new Thread(reader_wrapper, this); //here is the error happening.

関数 readre_wrapper は次のとおりです。

THREAD_Return GmpPipePlayer::reader_wrapper(void *p)

{
    GmpPipePlayer *t = (GmpPipePlayer *)p;

    t->reader_fn();

    return NULL;
}

この新しいスレッドは何度も呼び出されます。もう一度呼び出す前に、次のことを行います。

if (_pid > 0)
{
    kill(_pid, SIGTERM);
    _pid = 0;
}

if (_up)
{
    close(_up);
    _up = 0;
}

if (_down)
{
    close(_down);
    _down = 0;
}   

何が間違っているのですか?

4

1 に答える 1

3

さて、あなたはnew決して一致しないを持っていますdeletedelete _reader_thd;コードのある時点でが必要になります。または、動的オブジェクトをまったく使用しないでください。

于 2012-09-30T22:55:17.083 に答える