访问向量C 中的分割故障

Segmentation fault in access vector C++

本文关键字:分割 故障 向量 访问      更新时间:2023-10-16

我正在编写一个简单的多线程程序,以在多线程中的向量中添加和访问成员:
线程1:使用push_back将成员添加到向量
线程2:通过向量拨打函数迭代并检查成员是否已经在向量中,然后返回,否则返回NULL
在某个时候,我在线程2处面对分段故障,是向量安全性,以便在上面提到的事情。我没有任何代码可以从向量中删除成员,只添加更多代码。

这是函数的完整代码迭代向量:

Scope* ScopeList::FindScope(int32_t domain, int32_t channel) {
    Scope* findItem = new Scope(domain, channel);
    Scope* resultItem = NULL;
    for(uint32_t i = 0U; i < m_scope_list.size(); i++) {
        if(m_scope_list.at(i) == NULL) {
            continue;
        }
        if(m_scope_list.at(i)->isEqual(findItem)) {
            resultItem = m_scope_list.at(i);
            break;
        }
    }
    delete findItem;
    findItem = NULL;
    return resultItem;
}

这里m_scope_listScope对象的向量,isEqual函数的定义如下:

bool Scope::isEqual(Scope* scope) {
    if(scope == NULL||!this->m_domain ||!this->m_channel){
        return false;
    }
    bool result = this->m_domain == scope->GetDomain() && this->m_channel == scope->GetChannel();
    return result;
}

您需要同步两个线程。因为向量不是线程安全。如果您从一个线程中修改向量并从另一个线程访问,则很有可能会获得分割故障。您可能需要查看uniqe_lock或lock_guard和sutex以获取详细信息。如果您对他们的用法一无所知,请发表评论。快乐的多线程。

编辑:来自@gianpaolo发表的评论

push_back将以无法安全的方式修改向量的内部状态。如果您在已经达到其容量的矢量时调用push_back,则使用的当前t []数组将在新的t [](较高尺寸)中复制,并且将删除原件。当另一个线程在向量

上迭代时,您无法安全地做的事情