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));

posted on 2025-07-30 15:09  平ping  阅读(8)  评论(0)    收藏  举报