我在一个引发访问冲突异常的应用程序中有以下代码:
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容量并崩溃的元素,但我不知道这是怎么回事。有任何想法吗?提前谢谢。
答案 0 :(得分:1)
您试图从同一个矢量中删除一些对象。如果您不使用擦除删除习惯用法,则不会从向量中清除数据。最重要的是你在循环中擦除了操作,因此迭代器无效。请参阅以下更多详情
http://en.wikipedia.org/wiki/Erase - remove_idiom