0

我有以下代码:

#include <memory>
#include <functional>
#include <boost/lockfree/queue.hpp>

#define _ThreadPoolLength_  100

class thread_pool {
public:
    thread_pool() : q(_ThreadPoolLength_) {}

private:
    mutable boost::lockfree::queue<std::function<void(int id)> *> q;
};

class Worker
{
    thread_pool workerPool;
};

Worker* worker;

int main() {
    worker = new Worker();
    delete worker;
    return 0;
}

如果用 编译它clang++ -fsanitize=address,undefined code.cpp,那么在运行期间它会产生类似的东西:

构造函数调用未对齐的地址 0x6060000025a0 用于类型 'boost::lockfree::queue *>::node',这需要 64 字节对齐 0x6060000025a0:注意:指针指向此处

01 00 00 3c 40 25 00 00 60 60 be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be bebe be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be be安装

#0 0x519fc5 in boost::lockfree::queue<std::function<void (int)>*>::node* boost::lockfree::detail::freelist_stack<boost::lockfree::queue<std::function<void (int)>*>::node, std::allocator<boost::lockfree::queue<std::function<void (int)>*>::node> >::construct<true, false, boost::lockfree::queue<std::function<void (int)>*>::node*>(boost::lockfree::queue<std::function<void (int)>*>::node* const&) 
#1 0x517e77 in boost::lockfree::queue<std::function<void (int)>*>::initialize() 
#2 0x51743c in boost::lockfree::queue<std::function<void (int)>*>::queue(unsigned long) 
#3 0x51713f in thread_pool::thread_pool() 
#4 0x517048 in Worker::Worker() 
#5 0x516ed9 in main 
#6 0x7f6c3cb6bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#7 0x41a5f9 in _start

摘要:UndefinedBehaviorSanitizer:未定义的行为...

我怀疑错误是由 引起的boost::lockfree::queue<std::function<void(int id)> *>,但为什么呢?有没有办法解决它?

clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)

最后,我参考了一篇博boost::lockfree::queue<std::function<void(int id)> *>文,用类似的类替换了使用。

4

1 回答 1

0

您正在泄漏worker,因为您曾经new构建它而从不使用delete它来破坏它。其他 ASan 消息在那里,因为作为构造的一部分worker,它的成员队列也被构造了。

于 2020-04-21T06:24:43.240 回答