c ++ vector insert访问冲突读取位置

时间:2014-07-20 14:42:27

标签: c++ vector stl

我的矢量构造如下:

struct segment {
    float x1;
    float y1;
    float x2;
    float y2;
    float k;
    float b;
};

enum EventType {UPPER_PT = 0, LOWER_PT, INTER_PT};
struct order {
    float x;
    float y;
    vector<segment>::iterator line_id;
    vector<segment>::iterator line2_id;
    EventType type;
};

vector<segment> seg_lines;
vector<order> event_list;

初始化event_list后,我尝试在insert()随机位置order new_event; new_event.x = 300; new_event.y = 400; new_event.line_id = an_iterator_in_seg_lines; new_event.line2_id = another_iterator_in_seg_lines; new_event.type = INTER_PT; bool inte_inserted = false; for(vector<order>::iterator tmp_idx = event_list.begin(); tmp_idx != event_list.end(); tmp_idx++) { if(a_Y_threshold > tmp_idx->y || a_Y_threshold == tmp_idx->y && an_X_threshold < tmp_idx->x) { event_list.insert(tmp_idx, new_event); inte_inserted = true; break; } } 新元素,如下所示:

line_id

我可以向您保证line2_idnew_event都有效。我只是想简化我的描述。

在这种情况下,它会尝试在&#34;第五个位置&#34;处插入event_list,而event_list的大小和容量都是10和{ {1}}已满空有效order

但是我得到了这样的错误:

Unhandled exception in ... 0xC0000005: Access violation reading location 0x00000000

我认为错误代码告诉我,我使用了无效指针。但是我检查了我的手表&#39;视图和所有相关的迭代器(包括tmp_idx)都是有效的并且指向正确的位置。

我尝试使用emplace()代替insert(),但它不起作用。在插入新元素之前,我尝试resize()我的event_list,它也不起作用。但是当我使用list来构建event_list而不是vector时,它就像魅力一样。

那么,可能是什么导致了这个问题,如果我想坚持使用vector该怎么办呢?

我正在使用VS 2010。

1 个答案:

答案 0 :(得分:1)

来自cplusplus

  

如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将失效。

在向量上循环时插入,这可能会使迭代器失效。 您可以将元素推回到向量中而不是插入它们,并且只在最后重新排序向量。更简单,更清洁。

相关问题