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

问题在于,在第二个循环中,您在数组中相应元素的副本上调用 createB a_array。尝试将循环更改为:

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

    A& a = a_array[i];

    a.createB();
}

另请注意,您的程序中有很多内存泄漏 - 您分配了很多您从未释放过的东西。

在第一个循环中,无需在将 a 分配给数组中的元素之前动态分配它。只需这样做(正如皮特贝克尔指出的那样):

for ( int i = 0; i < n; i++ ) {
    a_array[i] = A();
}
于 2013-01-31T11:22:18.607 回答
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
...

不要忘记删除 a 的数组和实例。

但是,您应该看看vector<>and array<>,使用 STL 容器更好

于 2013-01-31T11:28:53.100 回答
0

第二个 for 循环中的 a a = a_array[i] 在堆栈上创建一个副本,该副本在循环范围之后再次被删除。循环之后的 a_array[0] 访问则指向另一个对象。

于 2013-01-31T11:31:04.927 回答