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

标签 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;
}

其中,upload 基本上是一个静态非成员函数,urlpathstd::string上传定义为:

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

最佳答案

您的代码最终会调用 std::thread::~thread它调用 std::terminate 因为线程既没有分离也没有连接。这就是 valgrind 报错的原因。

加入或分离线程。

关于c++ - 为什么使用 make_unique<> 将函数传递给线程会导致 Valgrind 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50582893/

相关文章:

c++ - vector push_back 随机发生

c++ - 指向一个模板化函数的不同实例的指针保证比较不相等?

mysql替换字符串计数限制

Java:如何在主线程的单独命令窗口中打开新线程的执行?

c# - 异步等待 Task.Delay 显着降低了基于 HttpListener 的服务器的带宽

c++ - 将派生自基类的类的实例传递给函数

c++ - 有没有办法以编程方式在 osx 上隐藏碳应用程序?

c++ - 创建 C 字符串的最佳方法

Python 2.7 使用函数的输入作为字符串和变量

ruby - 如何在 ruby​​ 中使循环多线程?