Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost线程内存泄漏?_C++_Boost_Memory Leaks_Valgrind - Fatal编程技术网

C++ boost线程内存泄漏?

C++ boost线程内存泄漏?,c++,boost,memory-leaks,valgrind,C++,Boost,Memory Leaks,Valgrind,我正在尝试boost线程,我从valgrind中注意到,仅仅通过一个空代码块循环,它就泄漏了320字节。我在谷歌上发现了一些2010年的帖子,这些帖子可能是在valgind运行之前没有关闭的线程的误报,但这有点不同。在这些示例中,您有几个仍然可以访问的块(因此,如果线程仍在运行,则可以释放),其中我的运行显示8个块仍然可以访问,20个块肯定丢失。这是我应该担心的事情,还是我不知怎么错过了什么?谢谢 代码 #include <boost/thread.hpp> #include <

我正在尝试boost线程,我从valgrind中注意到,仅仅通过一个空代码块循环,它就泄漏了320字节。我在谷歌上发现了一些2010年的帖子,这些帖子可能是在valgind运行之前没有关闭的线程的误报,但这有点不同。在这些示例中,您有几个仍然可以访问的块(因此,如果线程仍在运行,则可以释放),其中我的运行显示8个块仍然可以访问,20个块肯定丢失。这是我应该担心的事情,还是我不知怎么错过了什么?谢谢

代码

#include <boost/thread.hpp>
#include <iostream>
#define THREADS 20

void threadfunc(int workerid) {}

int main(int argc, char **argv){

    boost::thread *threads[THREADS];
    int i;
    for (i = 0; i < THREADS; i++) {
        threads[i] = new boost::thread(threadfunc, i);
    }
    for (i = 0; i < THREADS; i++) {
        threads[i]->join();
    }
}
瓦尔金德司令部

 G_SLICE=always-malloc G_DEBUG=gc-friendly  valgrind -v --tool=memcheck --leak-check=full --show-reachable=yes --num-callers=40 --log-file=valgrind.log ./example
Valgine结果

==31674== HEAP SUMMARY:
==31674==     in use at exit: 328 bytes in 21 blocks
==31674==   total heap usage: 103 allocs, 82 frees, 14,968 bytes allocated
==31674==
==31674== Searching for pointers to 21 not-freed blocks
==31674== Checked 215,920 bytes
==31674==
==31674== 8 bytes in 1 blocks are still reachable in loss record 1 of 2
==31674==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31674==    by 0x4E454A9: boost::detail::get_once_per_thread_epoch() (in /usr/lib/libboost_thread.so.1.46.1)
==31674==    by 0x4E3E4FF: ??? (in /usr/lib/libboost_thread.so.1.46.1)
==31674==    by 0x4E3E7C8: boost::detail::get_current_thread_data() (in /usr/lib/libboost_thread.so.1.46.1)
==31674==    by 0x4E3FF3A: boost::thread::join() (in /usr/lib/libboost_thread.so.1.46.1)
==31674==    by 0x402C79: main (in /home/Jason/php/base/example)
==31674==
==31674== 320 bytes in 20 blocks are definitely lost in loss record 2 of 2
==31674==    at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==31674==    by 0x402C2A: main (in /home/Jason/php/base/example)
==31674==
==31674== LEAK SUMMARY:
==31674==    definitely lost: 320 bytes in 20 blocks
==31674==    indirectly lost: 0 bytes in 0 blocks
==31674==      possibly lost: 0 bytes in 0 blocks
==31674==    still reachable: 8 bytes in 1 blocks
==31674==         suppressed: 0 bytes in 0 blocks
==31674==
==31674== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)
--31674--
--31674-- used_suppression:      2 dl-hack3-cond-1
==31674==
==31674== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 2 from 2)

这是您的错误,而不是boost::threads。 你的内存没有被释放

for (i = 0; i < THREADS; i++) {
    threads[i] = new boost::thread(threadfunc, i);
}
for(i=0;i
在退出主函数之前,必须释放内存(删除线程)。 差不多

for (i = 0; i < THREADS; i++) {
   delete threads[i];
}
for(i=0;i

或者在加入后删除下一个。

这是您的错误,而不是
boost::thread
s。 你的内存没有被释放

for (i = 0; i < THREADS; i++) {
    threads[i] = new boost::thread(threadfunc, i);
}
for(i=0;i
在退出主函数之前,必须释放内存(删除线程)。 差不多

for (i = 0; i < THREADS; i++) {
   delete threads[i];
}
for(i=0;i

或者在join之后删除next。

我在使用boost线程的每个valgrind运行中都看到了8个字节的“仍然可以访问”。所以,我认为这是正常的(可能是他们不得不做的),而且它似乎不依赖于线程的数量,也不随线程的数量而增长,可能是一些独特的全局数据没有被释放(故意释放)。这种记忆无论如何都会被回收,所以它不是真正的问题。对于其他20个“肯定丢失”的块,很明显,正如ForEveR指出的那样,这20个线程缺少
delete
调用。谢谢,不,它似乎没有增长。昨天我运行了一个测试,对PHP的内核进行线程处理,在对10个线程进行了上千次的重新创建和3000000多个分配(是的,这是6个零)之后,一个8字节的块是唯一的问题。8字节的“仍然可访问”是我在使用boost线程的每个valgrind运行中看到的。所以,我认为这是正常的(可能是他们不得不做的),而且它似乎不依赖于线程的数量,也不随线程的数量而增长,可能是一些独特的全局数据没有被释放(故意释放)。这种记忆无论如何都会被回收,所以它不是真正的问题。对于其他20个“肯定丢失”的块,很明显,正如ForEveR指出的那样,这20个线程缺少
delete
调用。谢谢,不,它似乎没有增长。昨天我运行了一个测试,对PHP的内核进行线程处理,在对10个线程进行了上千次的重新创建和3000000+次的分配(是的,这是6个零)之后,一个8字节的块是唯一的问题。我差点就被这个问题折服了。这证明了即使是咖啡也不能让我们在30小时后继续喝下去,lolI也有同样的问题。具有“*\u epoch”功能。但是,我不喜欢新的boost::thread。我的线程在main中的堆栈上分配。我加入他们,然后从主干道回来。我想知道你是否知道如何消除这个错误(除了抑制)。它似乎来自于boost,但——当然——它也可能是我正在做的事情。我差点在那把剑上摔了一跤。这证明了即使是咖啡也不能让我们在30小时后继续喝下去,lolI也有同样的问题。具有“*\u epoch”功能。但是,我不喜欢新的boost::thread。我的线程在main中的堆栈上分配。我加入他们,然后从主干道回来。我想知道你是否知道如何消除这个错误(除了抑制)。它似乎来自于boost,但——当然——它也可能是我正在做的事情。