C++ 分割在 vector.erase() 上失败

Posted

技术标签:

【中文标题】C++ 分割在 vector.erase() 上失败【英文标题】:C++ segmentation fail on vector.erase() 【发布时间】:2011-03-31 05:01:35 【问题描述】:

我的程序中的矢量有问题。我发现了许多类似的问题,但没有解决方案。此代码在新线程中:

    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

actions 是一个向量

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

更新

真正的问题是:这个方法的结构体已经被销毁了。

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

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

如何在没有 boost::bind 的情况下将可调用对象存储在线程中并保持指向它的指针?

【问题讨论】:

【参考方案1】:

猜测一下:您没有任何锁来保护您的actions 队列,是吗?

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

当您使用它时,您可能应该使用条件变量来避免每 20 毫秒唤醒一次,即使您无事可做。并为队列使用deque,而不是vector

【讨论】:

我发现了真正的问题。在此循环开始之前销毁的线程对象。

以上是关于C++ 分割在 vector.erase() 上失败的主要内容,如果未能解决你的问题,请参考以下文章

c++ vector erase的注意事项

c++ vector erase的注意事项

[转] C++ STL中map.erase(it++)用法原理解析

std::remove 与 vector::erase 和未定义的行为

vector erase怎么用

C++ vector容器删除操作