Чтение нарушений доступа из массива производных классов - PullRequest
3 голосов
/ 19 февраля 2011

(относится к этому вопросу .)

У меня есть базовый класс Base и два производных класса, Der1 и Der2.(См. Связанный вопрос для базовой реализации. У каждого также есть ряд открытых свойств.) В моей программе я создаю массив Base, например:

Base *array[10];
int count = 0; // program-wide count of how many objects are in the array

Затем позже я заполняю его экземплярами.Der1 и Der2 следующим образом:

Der1 d = Der1();
d.x = 0; // Filling in public properties
d.y = 1;
d.z = 3;
array[count] = &d;
count++;

Почти идентичный код используется для Der2.

Много позже я использую массив для вызова функций, определенных вэти классы:

int result = array[i]->SomeFunction(x, y);

Мой код компилируется нормально, но когда я пытаюсь его запустить, я получаю «Необработанное исключение по адресу 0x00232d60 в program.exe: 0xC000005: Место чтения нарушения доступа 0x04064560.»

Когда я смотрю на объект в массиве, к которому я пытаюсь получить доступ, все значения свойств равны 0,0000 вместо того, что они должны быть.Есть также два массива double -типа, и похоже, что последние несколько элементов неинициализированы («1.572398880752e-311 # DEN» или «-9.2559631349317831e + 061» или аналогичные).

слишком долго занимался .NET и забыл многое из того, что я знал об указателях, который, как я предполагаю, является источником моей проблемы ... Какие-нибудь предложения о том, как я могу исправить эту ошибку?

Ответы [ 4 ]

6 голосов
/ 19 февраля 2011

Вы заполнили массив указателями на локальные переменные.Они действительны только до тех пор, пока оригинальная локальная переменная остается в силе.Скорее всего, объекты, к которым вы пытаетесь получить доступ, просто вышли из области видимости.Попробуйте разместить их в куче и посмотрите, решит ли это проблему.

4 голосов
/ 19 февраля 2011
Der1 d = Der1();

создает экземпляр Der1 в стеке. Если d выходит из области видимости до того, как вы позвоните SomeFunction, вы получите нарушение доступа. Вы должны построить Der1 в куче, используя new.

Der1* d = new Der1();

Вам нужно удалить экземпляр d, если он вам больше не нужен или в конце программы:

delete d;
2 голосов
/ 19 февраля 2011

После следующего:

Der1 d = Der1();
...
array[count] = &d;

Ваш объект d будет уничтожен, как только закончится указанная область.Это означает, что вы не можете попытаться получить доступ позже с помощью чего-то вроде этого:

array[i]->SomeFunction(x, y);

, поскольку объект, на который ранее ссылалась указатель в этой позиции, теперь исчез.

1 голос
/ 19 февраля 2011
int result = array[i]->SomeFunction(x, y);

Убедитесь, что i меньше 10 и больше или равно 0.

...