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 に少なくとも 1 つの要素があることを確認し、.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

new2つのことを行います。オブジェクトにメモリを割り当てることと、オブジェクトのコンストラクターを呼び出すことです。g_new0最初の割り当てメモリのみを実行します。を使用する場合は、オブジェクトのコンストラクターを明示的に呼び出す必要がありますg_new0。これは、「新しい配置」を使用して行われます。

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;
于 2012-05-28T08:18:29.897 に答える