簡體   English   中英

c ++向量插入訪問沖突讀取位置

[英]c++ vector insert Access violation reading location

我的向量是這樣構造的:

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_idline2_id均有效。 我只是想簡化我的描述。

在這種情況下,它將嘗試在“第5個位置”插入一個new_event ,而event_list的大小和容量均為10,並且event_list充滿有效order

但是我得到這樣的錯誤:

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

我認為錯誤代碼告訴我我正在使用無效的指針。 但是我檢查了“觀察”視圖,所有相關的迭代器(包括tmp_idx )都有效並且指向正確的位置。

我嘗試使用emplace()而不是insert() ,它不起作用。 我嘗試在插入新元素之前對event_list進行resize() ,但這也不起作用。 但是,當我使用list構造event_list而不是vector ,它就像一個魅力。

那么,是什么引起了這個問題?如果我要堅持使用vector怎么辦?

我正在使用VS 2010。

來自cplusplus

如果發生重新分配,則與容器相關的所有迭代器,指針和引用都將無效。

您在循環插入向量時插入,這可能會使迭代器無效。 您可以將元素推回向量中,而不是插入它們,僅在最后對向量重新排序。 更輕松,更清潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM