当我运行以下代码时:
class Worker : public Thread{
private:
void readData(WorkItem *item, std::vector<DataPoint> &mt);
wqueue<WorkItem*>& queue;
ReqParser* reqParser;
public:
Worker(wqueue<WorkItem*>& queue, DatabaseService* db_service);
void* run();
};
Worker::Worker(wqueue<WorkItem*>& queue): m_queue(queue) {
reqParser = new SdkReqParser();
}
void* Worker::run() {
std::vector<DataPoint> peaks;
while(true) {
WorkItem* item = NULL;
item = queue.remove();
peaks.clear();
readData(item, peaks);
/**
the rest of logic never touching reqParser
**/
}
}
void Worker::readData(WorkItem *item, std::vector<DataPoint> &mt){
printf("readData: %p\n", reqParser);
fflush(stdout);
reqParser->parse(item->getReq(), item->getReqSize(), item, mt);
}
成功执行一段时间后,我从方法readData获取SIGSEGV。在分段错误发生之前,reqParser指针的地址会发生变化。没有调用析构函数,reqParser永远不会在每个程序调用一次的外部构造函数之外。
更改类定义中成员的顺序并在reqParser下面移动readData方法似乎可以解决问题。我不明白为什么,我不确定它是否是真正的解决方案。
class Worker : public Thread{
private:
wqueue<WorkItem*>& m_queue;
ReqParser* reqParser;
void readData(WorkItem *item, std::vector<DataPoint> &mt);
public:
Worker(wqueue<WorkItem*>& queue, DatabaseService* db_service);
void* run();
};