RemoveContact_HI已创建此函数以删除向量中的元素:
void JNP::IPComm_HostType::RemoveContact_H( UINT contactIndex,std::vector<IPContact>& l )
{
assert( contactIndex < l.size() );
l.erase( l.begin() + contactIndex );
}
然而它似乎不起作用。调用该函数时,不会删除该元素。向量的大小减少1,但您仍然可以通过编码
访问所有元素,包括已删除的元素hostList[some integer]
即如果hostList有2个元素,我就打电话给
RemoveContact_H( 0, hostList )
大小将减少到1,但这两个元素仍然会退出并且可以被访问!
修改
不出所料,错误是由于我的编码而不是vector :: erase()函数。我以前为IPContact类定义了equals运算符,它实际上没有复制任何数据。
答案 0 :(得分:5)
访问已从矢量中删除的元素是Undefined behavior。有时它会起作用(你的情况),但它会在可能的最糟糕的时刻崩溃(即在演示期间,或在你的家庭面前;)。
但是如果您使用std::vector::at
来访问已删除的元素,则会抛出std::out_of_range
例外。
std::vector::operator[]
未执行边界检查。
大小将减少到1,但这两个元素仍然会退出并且可以被访问!
就像我之前说过的,它是 Undefined Behavior ,你不应该尝试访问已删除的元素。尝试使用vector::at
,它会抛出异常。
答案 1 :(得分:3)
大小将减少到1,但这两个元素仍然会退出并且可以被访问!
否即可。如果向量的大小为1,则只存在一个元素(索引0),并且只能访问此元素。试图访问除此之外的元素是未定义的行为,因此它可能会使程序崩溃,或者它可能出现工作,谁知道,但在后一种情况下,不会使您的代码更正确。
换句话说,std::vector::erase()
表现得应该如此,只是你没有使用std::vector
(例如,你必须永远不要尝试访问结尾的元素)。
您可能希望使用std::vector::at()
代替std::vector::operator []()
,以便自行验证只有索引0可以访问。