Подтвердить что ты не робот

Boost thread Утечка С++

Может ли кто-нибудь сообщить мне, протекает ли утечка библиотеки потоков. Мне кажется, что он делает: Google говорит, что я должен скомпилировать как поток boost, так и pthread, который я делаю, и что в версии 1.40 эта проблема исправлена, но я все еще испытываю утечку. Обратите внимание, что это будет компилироваться, но обнаружены утечки.

#include <boost/thread.hpp>  
#include <boost/date_time.hpp>  

void t1(){}

int main(void){
boost::thread th1(t1);
th1.join();
return 1;
}

С Valgrind я получаю следующий вывод

HEAP SUMMARY:
==8209==     in use at exit: 8 bytes in 1 blocks
==8209==   total heap usage: 5 allocs, 4 frees, 388 bytes allocated
==8209== 
==8209== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==8209==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==8209==    by 0x4038CCB: boost::detail::get_once_per_thread_epoch() (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x40329D4: ??? (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x4032B26: boost::detail::get_current_thread_data() (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x4033F32: boost::thread::join() (in /usr/local/lib/libboost_thread.so.1.42.0)
==8209==    by 0x804E7C3: main (testboost.cpp)
==8209== 
==8209== LEAK SUMMARY:
==8209==    definitely lost: 0 bytes in 0 blocks
==8209==    indirectly lost: 0 bytes in 0 blocks
==8209==      possibly lost: 0 bytes in 0 blocks
==8209==    still reachable: 8 bytes in 1 blocks
==8209==         suppressed: 0 bytes in 0 blocks

Я также попытался использовать код, указанный на следующем веб-сайте: http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html По-прежнему та же проблема.

4b9b3361

Ответ 1

Это относится к boost 1_46_1, поэтому это может быть неверно для версии, которую вы используете. Посмотрите на источники повышения, если вы действительно хотите убедить себя. (Детектор утечки на OSX не обнаруживает никаких утечек при запуске вашего примера кода).

Это не настоящая утечка (если нет ошибки с pthreads, устаревшей версией boost, которую вы используете, или вашим компилятором).

get_once_per_thread_epoch mallocs добавляет новый uintmax_t и сопоставляет его с потоком-локальным хранилищем с epoch_tss_key, у которого есть связанный деструктор, который освобождает отображенные данные. Поэтому гарантируется освобождение памяти в malloced.

Я действительно не понимаю, почему valgrind обнаруживает это как утечку, но это может быть потому, что функции выхода pthreads выполняются в какой-то момент после valgrind. Другая возможность заключается в том, что сами функции pthread протекают, но я не видел ничего в документации, которая могла бы предположить, что это так.