[英]Dereferencing an out-of-range vector iterator - what happpens and why?
在我的设置上运行:
vector<int> myvector;
for (int i=1; i<=5; i++) myvector.insert(myvector.end(),i);
vector<int>::iterator it;
for ( it=myvector.begin() ; it < myvector.end()+2; it++ )
cout << " " << *it;
产量:
1 2 3 4 5 0 0
我原本以为尝试取消引用超出范围的迭代器会导致段错误。 但它似乎产生了向量中包含的类型的空或默认初始化对象。
这是明确定义的行为吗? 这个属性来自迭代器还是来自向量? 迭代器在某种意义上是否会捕获超出范围的异常,而是返回一个空对象?
我尝试在C ++ 11参考中找到这个,但感觉它有点过头了。
这是未定义的行为,这意味着任何事情都可能发生,包括段错误,或您经历过的事情或其他任何事情。 基本上,你很幸运它没有崩溃(或根据观点不吉利)。
C ++ Vector实现是使用数组完成的 - 如果大小超过,那么它会增加底层数组的大小:
这里有一些有趣的代码,Facebook已经开源了一段时间 - 关于内存管理的评论是一个了解更多内容的好方法Facebook FBvector
你得到的结果相当于访问'C数组'的越界 - 随机:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.