2012-05-28 72 views
0

由於某種原因,這不適用於我。它給了我向量迭代器超出範圍的錯誤。vector insert()錯誤:向量迭代器偏移量超出範圍

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開始,則會得到「Expression:vector iterator + offset超出範圍」,並且它會將矢量頭文件的第157行。

編輯:你們都可能是對的。該g_new0功能做內存分配http://developer.gnome.org/glib/2.32/glib-Memory-Allocation.html#g-new0

struct_type : the type of the elements to allocate. n_structs : the number of elements to allocate. Returns : a pointer to the allocated memory, cast to a pointer to 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; 
} 
+0

如果您可以發佈錯誤消息,它可能會有所幫助。另外,如果您正在複製整個矢量,您可以考慮* copy和swap *成語或賦值運算符。 – dirkgently

+1

我們需要知道User_Data是如何初始化矢量的,因爲所有這些代碼看起來都是有效的。 – pmr

+0

希望你已經分配了內存給User_Data。另外,請發佈User_Data構造函數中的代碼或發佈結構本身。 – Superman

回答

1

g_new0不是一個下拉更換爲new

new做兩兩件事:爲對象分配內存,並調用該對象的構造。 g_new0只做第一個,分配內存。如果要使用g_new0,則需要明確調用該對象的構造函數。這是使用「放置新的」完成:

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

之所以叫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; 
+0

我剛剛試過'State * data = new State','State * data = g_new0(State,1); 新(數據)狀態; ',但是當我的程序啓動時,我在內存位置讀取訪問衝突錯誤...我在「雜亂食譜」中使用了g_new0。也許我應該提到我正在使用C版本的混亂。我不知道這是否有什麼區別。我必須檢查我的代碼並做更多的思考和研究,但我需要睡一會兒。非常感謝您的幫助。 – MVTC