VS2010 Debug模式下运行时出现 vector iterator not dereferencable

yuanpeirong 2012-05-24 05:05:02

int main(int argc, char* argv[])
{

vector<int> v1;
for(int i=0; i!=101; i++)
v1.push_back(i);

vector<int>::iterator iter1=v1.erase(v1.begin()+95);
cout<<"删除后v1的第96个元素值是:"<<*iter1<<endl;
//以下一切正常
//以下代码,在MinGW下正常,在VS2010的Release下也正常
//在VS2010的Debug模式下编译正常,运行时出现
// vector iterator not dereferencable这样的错误提示
// 错误指向 vector 文件的第70行
iter1=v1.erase(v1.begin()+80, v1.begin()+83);
cout<<"删除后v1的第81个元素值是:"<<*iter1<<endl;

return 0;
}

...全文
823 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
junlee87 2013-09-27
  • 打赏
  • 举报
回复
引用 2 楼 ljljlj 的回复:
v1.begin()+83 vector不保证存储的内容在连续的地址,所以地址加常数是不正确的。好好看看《C++程序设计语言》 在iterator的使用中更不可erase,应该erase一个从头再iterator
“v1.begin()+83”是迭代器加常数,不是指针加常数,对于随机访问迭代器是没有问题的。 “在iterator的使用中更不可erase,应该erase一个从头再iterator”是对的。
lm_whales 2013-09-27
  • 打赏
  • 举报
回复
iter1=v1.erase(v1.begin()+80, v1.begin()+83); cout<<"删除后v1的第81个元素值是:"<<*iter1<<endl; 如果程序很大,或者一直在跑 这种代码早晚会出问题。 像这种代码量很少的时候,基本不会出问题。 因为vector<int>::iterator ,只是封装了一个一个指针而已。 如果不是调试版,或者操作系统原因等非语言因素。 指针解引用根本就不会有问题。 真正的问题的是你的程序,会在不确定的时候出错。 这是个时刻可能会爆炸的炸弹。 所以试验是可以的,使用最好不要这样用。 你这个试验,样本太少,不具有代表性,而且不是边界测试,所以看不到问题。
yuanpeirong 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
v1.begin()+83
vector不保证存储的内容在连续的地址,所以地址加常数是不正确的。好好看看《C++程序设计语言》
在iterator的使用中更不可erase,应该erase一个从头再iterator
[/Quote]

出错的地方是cout<<"删除后v1的第81个元素值是:"<<*iter1<<endl;
yuanpeirong 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
v1.begin()+83
vector不保证存储的内容在连续的地址,所以地址加常数是不正确的。好好看看《C++程序设计语言》
在iterator的使用中更不可erase,应该erase一个从头再iterator
[/Quote]

可是我在c++PRIMER 中看到对于vector,一定会是连续存储的,而且对于vector和deque的迭代器是可以加常数。并且除了VC2010的debug模式,在别的编译器都是正常编译通过和运行的。
都说VC对STL的实现不是很好,是不是VC对STL的实现问题

我现在再去看看《C++程序设计语言》,看看上面怎么说
ljhhh0123 2012-05-24
  • 打赏
  • 举报
回复
v1.begin()+83
vector不保证存储的内容在连续的地址,所以地址加常数是不正确的。好好看看《C++程序设计语言》
在iterator的使用中更不可erase,应该erase一个从头再iterator
W170532934 2012-05-24
  • 打赏
  • 举报
回复
额,VS2008没有遇到任何问题。不知道了

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧