【问题标题】:Access violation writing location 0x00000000. C++ / SFML game访问冲突写入位置 0x00000000。 C++ / SFML 游戏
【发布时间】:2012-11-20 03:27:20
【问题描述】:

我正在使用 C++ 和 SFML 2.0 进行一个学校项目,它将于周二到期,而我最近刚刚遇到了这个问题。 我在最新的调用堆栈所在的位置上放了一个箭头。 这些是我怀疑其中可能有问题的代码部分。我对 c++ 也很陌生,我知道我做错了很多事情。

这是在我的Background 类中,它加载我所有的图块,设置它们的位置和图块类型等等。

GetWayPointList 将图块向量返回给我的 EnemyManager

void Background::Load(QuadTree * quadTree) {

        int tempTiles[32][32] = {... Lots of 1's and 0's in here };

        for(int i = 0; i < 32; i++)
        {
            for(int j = 0; j < 32; j++)
            {
--->                    tile[j][i]->tileType = tempTiles[j][i];
                    tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32)));
                    if(tile[j][i]->tileType == 1)
                    {
                        quadTree->AddObject(tile[j][i]);            
                    }

                else if(tile[j][i]->tileType == 0)
                {
                    tile[j][i]->distanceFromStart = INT_MAX;
                    tile[j][i]->parent = NULL;

                    vector<Tile*> tempTiles;
                    if(tile[j+1][i]->tileType == 0)
                        tempTiles.push_back(tile[j+1][i]);
                    if(tile[j-1][i]->tileType == 0)
                        tempTiles.push_back(tile[j-1][i]);
                    if(tile[j][i+1]->tileType == 0)
                        tempTiles.push_back(tile[j][i+1]);
                    if(tile[j][i-1]->tileType == 0)
                        tempTiles.push_back(tile[j][i-1]);
                    tile[j][i]->setSuccessors(tempTiles);
                    tilesList->push_back(tile[j][i]);
                }
            }
        }
    }

vector<Tile*>* Background::GetWayPointList()
{
    return tilesList;
}

调用堆栈本身显示TileShooter v0.1.exe!Background::Load(QuadTree*quadTree) Line 68 + 0x2e bytes。 第 68 行是箭头所在的位置。

如果您需要更多代码/信息,请直接说。 任何关于可能出错的地方都会受到极大的赞赏。 最好的问候,弗雷德里克 W


编辑

我已经编辑了一些代码,包括tile[j][i] = new Tile();

void Background::Load(QuadTree * quadTree) {

        int tempTiles[32][32] = {... Lots of 1's and 0's in here };

        for(int i = 0; i < 32; i++)
        {
            for(int j = 0; j < 32; j++)
            {
                    tile[j][i] = new Tile();
                    tile[j][i]->tileType = tempTiles[j][i];
                    tile[j][i]->setPosition(sf::Vector2f((float)(i*32),(float)(j*32)));
                    if(tile[j][i]->tileType == 1)
                    {
                        quadTree->AddObject(tile[j][i]);            
                    }

                else if(tile[j][i]->tileType == 0)
                {
                    tile[j][i]->distanceFromStart = INT_MAX;
                    tile[j][i]->parent = NULL;

                    vector<Tile*> tempTiles;
---->                   if(tile[j+1][i]->tileType == 0)
                        tempTiles.push_back(tile[j+1][i]);
                    if(tile[j-1][i]->tileType == 0)
                        tempTiles.push_back(tile[j-1][i]);
                    if(tile[j][i+1]->tileType == 0)
                        tempTiles.push_back(tile[j][i+1]);
                    if(tile[j][i-1]->tileType == 0)
                        tempTiles.push_back(tile[j][i-1]);
                    tile[j][i]->setSuccessors(tempTiles);
                    tilesList->push_back(tile[j][i]);
                }
            }
        }
    }

vector<Tile*>* Background::GetWayPointList()
{
    return tilesList;
}

这并没有真正解决,而是将错误向下移动,我将箭头移动到调用堆栈最新调用的位置。

【问题讨论】:

  • 你在哪里定义tile?我猜你的问题是tile 太小或尚未分配或tile 中的元素未分配。
  • Tile 在 Background.h 中定义为 Tile* tile[32][32];
  • 从不理解学校对巨大的多维数组的痴迷
  • 通过您的编辑,您让我的回答毫无意义。
  • @Lightness Races in Orbit - 我们或许应该称它们为“老派”,但你是对的。

标签: c++ sfml


【解决方案1】:

所以您的tile 成员定义为Tile* tile[32][32]。这是一个大小为 32x32 的二维数组,其中每个元素都是指向 Tile 的指针。但是,它们是 just 指针,目前没有特别指向任何地方 - 访问它们是未定义的行为(在您的情况下,访问冲突)。您需要分配实际的Tile 对象:

for (int i = 0; i < 32; i++) {
  for (int j = 0; j < 32; j++) {
    tile[i][j] = new Tile();
  }
}

不要忘记在 Background 的析构函数中执行与 delete tile[i][j]; 相同的循环。

更好的是,不要动态分配您的磁贴,只需将tile 定义为:

Tile tile[32][32];

更好的是(!),使用std::array&lt;std::array&lt;Tile,32&gt;,32&gt;。 :)


回答您的编辑,即使它使我的上述答案无效:您正在访问tilej+1th 元素。当 j 为 31 时,您访问的 tile[32] 超出了您的数组范围。

【讨论】:

  • @Lightness Races in Orbit - 我想知道如果我们可以利用世界上所有无聊的 C++ 程序员的力量会取得什么成就。
  • @SChepurin:你看过神秘博士玛莎琼斯打败大师的那一集吗?她是怎么做到的? 这就是可以实现的目标。
  • @Lightness Races in Orbit - 我生命中的大部分时间都生活在“替代现实”中,我不知道谁是 Dr. Who)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多