0

次のコードスニペットがあります。

A.h

include B.h

class A
{
public:
    void createB();
    B* getB();
private:
    B *b;
};

A.cpp

void A::createB()
{
    b = new B();
}

B* A::getB()
{
    return b;
}

Main.cpp

int main()
{
    int n = 3;

    A *a_array = new A[n];

    for ( int i = 0; i < n; i++ ) {

        A *a = new A();

        a_array[i] = *a;
    }

    for ( int i = 0; i < n; i++ ) {

        A a = a_array[i];

        a.createB();
    }

    a_array[0].doStuff();   // OK

    a_array[0].getB();  // returns NULL
}

Output:

    A created
    A created
    A created
    B created
    A destroyed
    B created
    A destroyed
    B created
    A destroyed

Aオブジェクトはループで破壊されているようですが、ループなしでアクセスできますが、Aのオブジェクトメンバーにアクセスできません。

4

3 に答える 3

2

問題は、2番目のループで、配列内の対応する要素のコピーに対してcreateBを呼び出すことですa_array。ループを次のように変更してみてください。

for ( int i = 0; i < n; i++ ) {

    A& a = a_array[i];

    a.createB();
}

また、プログラムに多くのメモリリークがあることに注意してください。解放しないものをたくさん割り当てます。

最初のサイクルでは、配列内の要素に割り当てる前に動的に割り当てる必要はありません。単純に行う(ピートベッカーが指摘したように):

for ( int i = 0; i < n; i++ ) {
    a_array[i] = A();
}
于 2013-01-31T11:22:18.607 に答える
0

2番目のforループのa=a_array [i]は、スタック上にコピーを作成し、ループスコープの後で再び削除されます。ループ後のa_array[0]アクセスは、別のオブジェクトを参照します。

于 2013-01-31T11:31:04.927 に答える
0
int main()
{

int n = 3;

A *a_array = new A[n];

for ( int i = 0; i < n; i++ ) {

    A *a = new A();

    a_array[i] = *a;   // here you are copying a and then causing a memleak
}

あなたがおそらく意味していたのは

A **a_array = new A*[n];

for ( int i = 0; i < n; i++ ) {
    A *a = new A();
    a_array[i] = a;   // now array points to instance of a
}

ポインターを参照すると、次のようになります。

for ( int i = 0; i < n; i++ ) {
  A* a = a_array[i];
  a->createB();
}

a_array[0]->doStuff();   // OK
a_array[0]->getB();  // returns NULL
...

の配列とインスタンスを削除することを忘れないでください。

ただし、 STL コンテナーを使用する方が良いので、vector<>とを参照する必要があります。array<>

于 2013-01-31T11:28:53.100 に答える