У меня есть следующий фрагмент кода:
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.
Проблема в том, что во втором цикле вы вызываете 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();
}
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
A = a_array [i] во втором цикле for создает копию в стеке, которая снова удаляется после области видимости цикла. Доступ к a_array [0] после цикла ссылается на другой объект.