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

时间:2015-04-16 22:05:20

标签: c++ vector

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

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个看起来像有效数据的条目,但在另一个函数中调用了connections_vector.erase(it)以在调用get_active_connections之前删除断开连接的条目。

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

1 个答案:

答案 0 :(得分:1)

您试图从同一个矢量中删除一些对象。如果您不使用擦除删除习惯用法,则不会从向量中清除数据。最重要的是你在循环中擦除了操作,因此迭代器无效。请参阅以下更多详情

Iterator invalidation rules

http://en.wikipedia.org/wiki/Erase - remove_idiom