RemoveContact_HI创建了这个函数来删除向量中的元素:
void JNP::IPComm_HostType::RemoveContact_H( UINT contactIndex,std::vector<IPContact>& l )
{
assert( contactIndex < l.size() );
l.erase( l.begin() + contactIndex );
}
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用.调用该函数时,不会删除该元素.向量的大小减少1,但您仍然可以通过编码访问包括已删除元素在内的所有元素
hostList[some integer]
Run Code Online (Sandbox Code Playgroud)
即如果hostList有2个元素,我打电话
RemoveContact_H( 0, hostList )
Run Code Online (Sandbox Code Playgroud)
大小将减少到1,但两个元素仍然会退出并可以访问!
编辑
不出所料,错误是由于我的编码而不是vector :: erase()函数.我以前为IPContact类定义了equals运算符,它实际上没有复制任何数据.
访问已从矢量中删除的元素是未定义的行为.有时它会起作用(你的情况),但它会在可能的最糟糕的时刻崩溃(即在演示期间,或在你的家庭面前;)).
但是,如果您使用std::vector::at访问已擦除的元素,它将抛出std::out_of_range异常.
在std::vector::operator[]不执行边界检查.
大小将减少到1,但两个元素仍然会退出并可以访问!
就像我之前说的那样,它是未定义的行为,你不应该尝试访问已擦除的元素.试着这样做vector::at,它会抛出异常.