gpt4 book ai didi

c++ - vector const_iterator 如何越过 vector end?

转载 作者:行者123 更新时间:2023-11-28 06:18:51 25 4
gpt4 key购买 nike

我在抛出访问冲突异常的应用程序中有以下代码:

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++ 应用程序,在使用转储文件的调试 session 中,我发现了以下值:

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 容量的元素并崩溃,但我不明白这怎么可能。有任何想法吗?提前致谢。

最佳答案

您试图从同一 vector 中删除一些对象。如果不使用 erase remove 习语,数据将不会从 vector 中清除。最重要的是,您在循环内执行了删除操作,因此迭代器无效。请引用以下更多详细信息

Iterator invalidation rules

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

关于c++ - vector const_iterator 如何越过 vector end?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29686803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com