valgrind笔记
最近遇到了一个问题,访问自定义的线程池的任务队列的Task类的string时,总是会崩溃。使用valgrind运行,崩溃后报错如下:
==67991== Thread 5:
==67991== Invalid read of size 8
==67991== at 0x4A01694: std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30)
==67991== by 0x136362: my::WordQuery::doQuery(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (WordQuery.cc:131)
...
==67991== by 0x164984: my::Threadpool::threadFunc() (ThreadPool.cc:71)
==67991== Address 0x1ffeffd358 is on thread 1's stack
==67991== 7688 bytes below stack pointer
实际上已经在打印中可以看到:
第一行显示了“Thread 5:Invalid read of size 8”,最后显示了“Address 0x1ffeffd358 is on thread 1's stack”,说明了线程5访问了线程1的栈stack。
检查代码后,发现是将任务对象加入线程池时,忘记了使用智能指针shared_ptr,导致任务在传入线程池后就析构,相当于将临时对象传入线程池,肯定会有问题:
auto task = std::make_shared<Task>(msg.body, conn);
Singleton<SearchWorkThreadpool>::getInstance().addTask(
std::bind(&Task::execute, task));
浙公网安备 33010602011771号