Получение 0xC0000005: место чтения нарушения доступа, в котором хранится новый указатель в массиве указателей. - PullRequest
0 голосов
/ 17 мая 2018

Я пишу базовую Asteroids программу, используя SFML graphics library, и получаю errors/crashes при отладке программы. Это происходит только тогда, когда я пытаюсь выстрелить "photon torpedo" из моего корабля через пробел. Вот фрагмент кода.

//check for keypress

        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space) {
            for (int index = 0; index < MAX_PHOTONS; index++) {
                photons[index] = new SpaceObject(PHOTON_TORPEDO, PHOTON_RADIUS, ship->getLocation(), ship->getVelocity(), ship->getAngle())
                photons[index]->applyThrust(PHOTON_SPEED);
                std::cout << "LAUNCHING TORPEDO\n";
            }
        }

    // update game objects ------------------------------------------
     ship->updatePosition();

     for (int index = 0; index < ARRAY_SIZE; index++) {
         if (&asteroids[index] != NULL) {
             asteroids[index]->updatePosition();
         }
     }

     for (int index = 0; index < MAX_PHOTONS; index++) {
         if (&photons[index] != NULL) {
             photons[index]->updatePosition();
         }
     }


    // draw new frame ------------------------------------------------
    window.clear();
    window.draw(background);

    for (int index = 0; index < ARRAY_SIZE; index++) {
        if (&asteroids[index] != NULL) {
            asteroids[index]->draw(window);
        }
    }

    for (int index = 0; index < MAX_PHOTONS; index++) {
        if (&photons[index] != NULL) {
            photons[index]->draw(window);
        }
    }

Запуск кода вызывает мгновенный сбой, а отладка приводит к:

Необработанное исключение в 0x00311746 в polygons2.exe: 0xC0000005: Доступ нарушение считывания местоположения 0x00000018.

Я полагаю, что ошибка заключается в событии нажатия клавиши.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Просто для уточнения правильного ответа Дмитрия Колчева:

A & при использовании в коде извлекает адрес объекта:

int i = 15;   /* Integer, contains '15' */
int* pi = &i;  /* Pointer to an integer, contains the address of i in memory*/

Теперь у вас есть массив, подобный

int array [3] = {1, 2, 3};

Тогда

assert(1 == array[0]);
assert(2 == array[1]);
assert(3 == array[3]);

имеет место. array[i] извлекает содержимое массива в позиции i. &array[i] обозначает адрес памяти элемента в позиции i:

int a0 = array[0];   /* array[0] is of type int */
int* ap0 = &array[0]; /* &array[0] is of type int* */

Кстати, array[i] - это просто короткая рука для *(array + i), а &array[0] равняется array + i:

assert(array[i] == *(array + i));
assert(&array[i] == array + i);

Но это немного другая история ...

0 голосов
/ 17 мая 2018

Ваш код содержит опечатки. Не используйте ссылки на оператор доступа к объектам. Элементами астероидов и фотонов являются адреса соответствующих объектов.

 for (int index = 0; index < ARRAY_SIZE; index++) {
     if (asteroids[index] != NULL) {
         asteroids[index]->updatePosition();
     }
 }

 for (int index = 0; index < MAX_PHOTONS; index++) {
     if (photons[index] != NULL) {
         photons[index]->updatePosition();
     }
 }


// draw new frame ------------------------------------------------
window.clear();
window.draw(background);

for (int index = 0; index < ARRAY_SIZE; index++) {
    if (asteroids[index] != NULL) {
        asteroids[index]->draw(window);
    }
}

for (int index = 0; index < MAX_PHOTONS; index++) {
    if (photons[index] != NULL) {
        photons[index]->draw(window);
    }
}
...