У меня есть следующий код:
#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 3 c 40 25 00 00 60 60 будет быть быть быть быть быть быть быть быть быть быть быть быть быть быть ^
#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: undefined-поведение ...
Я подозреваю, что ошибки были вызваны 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)> *>
на аналогичный класс, сославшись на сообщение в блоге .