Почему передача функции в поток с помощью make_unique <> вызывает утечку памяти в Valgrind? - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь сделать это:

int main(){
    std::unique_ptr<std::thread> up(nullptr);
    up = std::make_unique<std::thread>(upload, url, path);
    return 0;
}

, где upload - это статическая функция, не являющаяся членом, а url и path равны std::string.upload определяется как:

static void upload(const string url, const string path){ int sync_status;}

Но об этом всегда сообщают как об утечке памяти в Valgrind:

249 (80 direct, 169 indirect) bytes in 1 blocks are definitely lost in loss record 151 of 169
==12088==    at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12088==    by 0x1395F9: _S_make_state<std::thread::_Invoker<std::tuple<void (*)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> , std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > (thread:197)
==12088==    by 0x1395F9: thread<void (&)(std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char>), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> &> (thread:126)
==12088==    by 0x1395F9: std::_MakeUniq<std::thread>::__single_object std::make_unique<std::thread, void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> ), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>(void (&)(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >), std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> &, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (unique_ptr.h:825)
==12088==    by 0x131D8D: main

1 Ответ

0 голосов
/ 29 мая 2018

Ваш код в итоге вызывает std::thread::~thread, который вызывает std::terminate, поскольку поток не отсоединен и не присоединен.Вот почему valgrind сообщает об ошибке.

Либо присоедините, либо отсоедините поток.

...