C ++访问持有此成员的对象时无法访问对象成员

时间:2013-01-31 11:19:55

标签: c++ pointers members

我有以下代码段:

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的对象成员。

3 个答案:

答案 0 :(得分:2)

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

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

    A& a = a_array[i];

    a.createB();
}

另请注意,您的程序中存在大量内存泄漏 - 您分配了许多永远不会释放的内容。

在第一个循环中,在将其分配给数组中的元素之前,不需要动态分配。简单地说(正如Pete Becker所指出的那样):

for ( int i = 0; i < n; i++ ) {
    a_array[i] = A();
}

答案 1 :(得分: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
...

不要忘记删除。

的数组和实例

然而,你应该看一下vector<>array<>,使用STL容器会更好

答案 2 :(得分:0)

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