2

私は構造体を定義しました:

struct something {
    SimpleClass *object;
};

宣言されたこれらの構造体の配列を作成したい

something* array = (something*)malloc(sizeof(something) * 2);

次に、構造体の作成、オブジェクトの埋め込み、配列への追加をループします。

for (int i = 0; i < 2; i++) {
    something aSomething;
    SimpleClass anObject = SimpleClass(i);
    aSomething.object = &anObject;
    array[i] = aSomething;
    // Point 1
}
// Point 2

この行を呼び出すと(たとえば)、オブジェクトが破棄されることがあります。

array[0].object->doSomething();

「ポイント 1」では正常に動作しますが、「ポイント 2」でエラーが発生します。

前もって感謝します。

4

4 に答える 4

2

スタックに依存しているため、変数のスコープに注意する必要があります。

SimpleClass anObject = SimpleClass(i);

これはループの最後で破棄されます。何かを永続的に保つには、新しいメモリを で割り当てる必要がありますnew

SimpleClass* anObject = new SimpleClass(i);
aSomething.object = anObject;
array[i] = aSomething;

これで問題が解決するはずです。また、後で必ず削除する必要があります。そうしないと、メモリ リークが発生します。

for(int i = 0; i < sizeOfArray; i++)
{
    delete array[i].object;
}

あなたの例では

something aSomething

ループの最後にも削除されます

于 2013-06-07T18:04:57.020 に答える
1

1) malloc の代わりに new 演算子を使用してオブジェクトを作成する

something* array = new something[2];

2) for ループの終了後に for ループ内でローカル オブジェクトを作成しているため、ローカル オブジェクト "anObject " が破棄されます。そのため、 for ループの外側でエラーが表示されます 代わりに、保存する動的オブジェクトを作成します。

 something*aSomething = new something();
 SimpleClass* anObject = new SimpleClass(i);
    aSomething->object = anObject;
    array[i] = aSomething;
于 2013-06-07T18:05:38.033 に答える
-1

キーワード「new」を使用して、配列とその要素の両方を作成します。Malloc は C のものであり、C++ では廃止されました。

于 2013-06-07T18:05:11.693 に答える