出于某种原因,这对我不起作用。它给了我矢量迭代器超出范围的误差。
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;
}
答案 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;