成员字段上面的c ++成员函数

时间:2016-05-18 07:06:47

标签: c++ oop pointers

当我运行以下代码时:

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

0 个答案:

没有答案