vector insert()error:向量迭代器偏移超出范围

时间:2012-05-28 06:55:34

标签: c++ vector

出于某种原因,这对我不起作用。它给了我矢量迭代器超出范围的误差。

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-&gt; DPath没有任何问题,因为我可以推送/弹出并访问其中的元素。但由于某种原因,我不能缝合能够使用插入而不会超出范围错误。

有谁知道为什么会这样?

编辑:弹出窗口出现,调试断言失败。它给了我一个矢量头文件中的一行1111,以及一条消息“Expression:vector iterator out of range”。如果我确保User_Data-&gt; DPath中至少有一个元素,然后从.begin + 1开始,我得到“Expression:vector iterator + offset out of range”,它给出了向量头的第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;
 }

1 个答案:

答案 0 :(得分:1)

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的构造函数很重要的原因是它反过来调用了vector<directory_entry> State成员的构造函数,这就是初始化向量的原因。如果没有正确初始化向量,则无法使用它。

请注意,由于您正在显式调用构造函数,因此您还需要在释放内存之前显式调用析构函数:

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

您是否有理由使用g_new0而非new

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