繁体   English   中英

向量const_iterator如何越过向量结束?

[英]How can vector const_iterator go past vector end?

我的应用程序中有以下代码引发了访问冲突异常:

size_t CConnectionsDoc::get_active_connections( std::vector<CString> &conn )
{
    CString temp;
    size_t cnt = 0;
    conn.clear();

    if( initialized ) {
        for( std::vector<ACTIVE_CONNECTIONS>::const_iterator c_i = connections_vector.begin();
                c_i != connections_vector.end(); c_i++ ) {
            temp.Format( "%s:%d:%d:%lu", ( LPCTSTR )c_i->their_ip,
                         c_i->their_port, c_i->our_sd, c_i->their_pa );
            conn.push_back( temp );
            cnt++;
        }
    }

    return cnt;
    }


void CConnectionsDoc::update_connections( const uint sd )
{
    std::vector<ACTIVE_CONNECTIONS>::iterator iter = connections_vector.begin();

    while( iter != connections_vector.end() ) {
        if( iter->our_sd == sd ) {
            connections_vector.erase(iter);
            break;
        }

        iter++;
    }
}

typedef struct active_connections
{
    CString their_ip;
    unsigned int their_port;
    unsigned int our_sd;
    unsigned long their_pa;
} ACTIVE_CONNECTIONS;

example data
    their_ip  "192.168.1.125"
    their_port 60849
    our_sd     1096
    their_pa   2097260736

这是一个Visual Studio 2012 C ++应用程序,通过使用转储文件的调试会话,我发现了以下值:

initialized=1
connections_vector size=8
connections_vector capacity=13
connections_vector entries 0-7 have valid data and debugger does not show any entries past element 7
cnt=13 at the time of the crash (odd it is the same size of the capacity)
conn size=13
conn capacity=13

std :: vector conn具有来自connections_vector的8个正确条目以及看起来像有效数据的5个条目,但是在调用get_active_connections之前,在另一个函数中调用connections_vector.erase(it)来删除断开连接的条目。

似乎const_iterator超出了connections_vector.end()的范围,直到它尝试访问超出connections_vector容量的一个元素并崩溃了,但是我不知道这是怎么可能的。 有任何想法吗? 提前致谢。

您试图删除同一矢量中的某些对象。 如果您不使用擦除删除惯用语,则不会从矢量中清除数据。 最重要的是,您在循环内执行了擦除操作,因此迭代器无效。 请参考以下更多详细信息

迭代器失效规则

http://en.wikipedia.org/wiki/擦除–remove_idiom

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM