указатели — C ++ Невозможно получить доступ к элементу объекта при доступе к объекту, содержащему этот элемент

У меня есть следующий фрагмент кода:

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.

0

Решение

Проблема в том, что во втором цикле вы вызываете 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();
}
2

Другие решения

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

0

A = a_array [i] во втором цикле for создает копию в стеке, которая снова удаляется после области видимости цикла. Доступ к a_array [0] после цикла ссылается на другой объект.

0
По вопросам рекламы [email protected]