为什么使用make_unique <>将函数传递给线程导致Valgrind中的内存泄漏?

Shi*_*wal 0 c++ string multithreading c++14

我正在尝试这样做:

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

其中,upload基本上是一个静态非成员函数,url并且pathstd::string.upload定义为:

static void upload(const string url, const string path){ int sync_status;}
Run Code Online (Sandbox Code Playgroud)

但在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
Run Code Online (Sandbox Code Playgroud)

Max*_*kin 5

您的代码最终会调用std::thread::~thread哪些调用,std::terminate因为该线程既不是分离也不是连接.这就是valgrind报告错误的原因.

加入或分离线程.