瓦尔格林德:块肯定在损失记录中丢失.在新线程中

valgrind: blocks are definitely lost in loss record... in new thread

本文关键字:新线程 线程 记录 损失 林德      更新时间:2023-10-16

我运行这段代码,我从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)

代码为: 向下[2],向上[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;
}   

任何想法出了什么问题?

好吧,您有一个从未与delete匹配的new。在代码中的某个时刻,您需要一个delete _reader_thd;。或者根本不使用动态对象。