vector.erase()上的C ++分段失败

时间:2011-03-31 05:01:36

标签: c++ vector segmentation-fault

我的程序中有vector的问题。我发现了许多类似的问题但没有解决方案这段代码在新主题中:

    while(status == RUN){
    msleep(20);
    while(status != DESTROY && (!actions.empty()) ){
        item = actions.begin();
        (*item)();
        cout<< "try remove the action!\n";
        item=actions.erase(actions.begin());
        cout << "everything ok!\n";
    }
}

输出是:

action!
try remove the action!
Segmentation fault

动作是向量&lt;作用&gt;

struct action{
    string query;
    long size;
    void operator()(){
        cout << "action!\n";
    }
};

更新

真正的问题是:使用此方法的struct已经被破坏。

class mthread{
    ...
    deque<action> actions;
    ...
    operator(){
        (loop above)
    }
};

class mthread_holder{
    mthread* mt;
    operator()(){
        (*mt)();
    }
    mthread_holder(mthread *p){
        mt = p;
    }
};

然后我只使用:

threads.back().thrd = new boost::thread(mthread_holder(mthrd));

我想,我需要更安全地存储它

如何在线程中存储callable并在不使用boost :: bind?

的情况下保存指向它的指针

1 个答案:

答案 0 :(得分:1)

猜测:你没有任何锁保护你的actions队列,是吗?

当从多个线程访问相同的数据结构时,您需要使用锁或其他同步构造来防止同时访问,否则可能会导致奇怪的事情(崩溃或更糟)。

当你在这里时,你可能应该使用一个条件变量来避免每20毫秒唤醒一次,即使没有任何事情可做。并使用deque作为队列,而不是vector