接收0xC0000005:访问冲突读取位置,在指针数组中存储新指针

时间:2018-05-17 04:50:58

标签: c++ pointers graphics logic sfml

我正在编写一个基本的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);
        }
    }

运行代码会导致即时崩溃,并且调试结果为:

  

polygons2.exe中0x00311746处的未处理异常:0xC0000005:Access   违规读取位置0x00000018。

我认为错误在于按键事件。

2 个答案:

答案 0 :(得分:1)

您的代码有拼写错误。不要使用引用操作员访问对象引用。小行星的元素&amp;光子是相应对象的地址。

 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);
    }
}

答案 1 :(得分:1)

只是为了澄清Dmitry Kolchev的正确答案:

在代码中使用它时&检索实体的地址:

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);

但那是一个略有不同的故事......