0

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

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;
 }
4

1 回答 1

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您使用而不是 just是否有原因new

State *data = new State;
...   // use data
delete data;
于 2012-05-28T08:18:29.897 回答