簡體   English   中英

向量insert()錯誤:向量迭代器偏移超出范圍

[英]vector insert() error: vector iterator offset out of range

由於某種原因,這對我不起作用。 它給了我向量迭代器超出范圍的錯誤。

directory_entry TDE("Path");
vector <directory_entry> Temp;
Temp.push_back(TDE);

User_Data->DPath.insert(User_Data->DPath.begin(), Temp.begin(), Temp.end());

但是,這有效

vector <directory_entry> DPath;
directory_entry TDE("Path");
vector <directory_entry> Temp;
Temp.push_back(TDE);

DPath.insert(DPath.begin(), Temp.begin(), Temp.end());

我認為User_Data-> DPath沒什么問題,因為我可以推送/彈出並訪問其中的元素。 但是由於某種原因,我無法在不超出范圍錯誤的情況下在其上使用插入。

有誰知道為什么會這樣嗎?

編輯:出現一個彈出窗口,調試斷言失敗。 它在向量頭文件1111中給我一行,並顯示一條消息“表達式:向量迭代器超出范圍”。 如果我確定User_Data-> DPath中至少有一個元素,然后從.begin + 1開始,則會出現“表達式:向量迭代器+偏移量超出范圍”的情況,它為我提供了向量頭文件的第157行。

編輯:你可能都是正確的。 g_new0函數執行內存分配http://developer.gnome.org/glib/2.32/glib-Memory-Allocation.html#g-new0

struct_type:要分配的元素的類型。 n_structs:要分配的元素數。 返回:指向已分配內存的指針,轉換為struct_type的指針。

typedef struct {
    vector <directory_entry> DPath;
}State;

static gboolian select_dir (ClutterActor *actor, ClutterEvent *event, g_pointer data){
    State *User_Data = (State*)data;

    directory_entry Temp(Path);
    User_Data->DPath.push_back(Temp);

    ...
    return TRUE;
}


int main( argc, char*argv[]){
State *data = g_new0 (State, 1); 

...  

 g_signal_connect(Cluter_Actor, "button-event", G_CALLBACK(select_dir), data)

 ...

 clutter_main();
 g_free(data);
 return 0;
 }

g_new0不能替代new

new做兩件事:為對象分配內存,並調用對象的構造函數。 g_new0僅執行第一個分配內存的操作。 如果要使用g_new0則需要顯式調用該對象的構造函數。 這可以通過“ placement new”來完成:

State *data = g_new0 (State, 1); 
new (data) State;  // placement new - calls the constructor

調用State的構造函數很重要的原因是,它依次調用State的vector<directory_entry>成員的構造函數,這就是初始化矢量的原因。 如果不正確初始化向量,則無法使用它。

請注意,由於要顯式調用構造函數,因此在釋放內存之前,還需要顯式調用析構函數:

data->~State();  // call destructor
g_free(data);    // free the memory

您使用g_new0而不是new是有原因的嗎?

State *data = new State;
...   // use data
delete data;

暫無
暫無

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

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