c++ - 程序收到信号 EXC_BAD_ACCESS - Mac OS X

标签 c++

当我将 std::vector 中的元素与 char 进行比较时,有时在运行程序时会随机出现此错误(大约每五次一次):

Program received signal EXC_BAD_ACCESS, Could not access memory.

Reason: 13 at address: 0x0000000000000000

0x0000000100017c49 in randomCaveGenerator (p=@0x7fff5fbff51c, q=@0x7fff5fbff518, seed=1234567) at src/main.cpp:198 198 if (lm.map[1][i][j] == '0')

v 被定义为填充了所有元素的 std::vector。我知道这个错误通常意味着它指向一个空指针但我知道不应该有一个

我正在使用 Mac OS X 10.8,gdb 进行调试,Apple LLVM 4.2 版(基于 LLVM 3.2svn)进行编译。

编辑

我正在使用的代码:

typedef std::vector< std::vector<char> > MapGrid;

struct LevelMap
{
    std::string name;
    std::vector<MapGrid> map;
    sf::Vector2u size;
};


LevelMap randomCaveGenerator(int p=64, int q=64, unsigned long seed=1)
{

    if (p < 64)
         p = 64;
    if (q < 64)
         q = 64;

    int groundLevel = 12;

    srand(seed);

    sf::Vector2u size(p, q);
    std::vector<MapGrid> mapG(3);
    for (int i = 0; i < 3; i++)
    {
        mapG[i] = MapGrid(size.x, std::vector<char>(size.y));

        for (int y = 0; y < size.y; y++)
        {
            for (int x = 0; x < size.x; x++)
            {
                 mapG[i][x][y] = '0';
            }
        }
    }

    for (int y = 0; y < size.y; y++)
    {
        for (int x = 0; x < size.x; x++)
        {
            mapG[0][x][y] = 'v'; // Void Tile
        }
    }
    for (int y = 0; y < size.y; y++)
    {
        for (int x = 0; x < size.x; x++)
        {
            mapG[2][x][y] = '0'; // Air Tile
        }
    }

    for (int y = groundLevel; y < size.y; y++)
    {
        for (int x = 0; x < size.x; x++)
        {
            int e = 23;
            if (2+(rand()%e)< e/2)
                mapG[1][x][y] = 'd';
            else
                mapG[1][x][y] = '0';

        }
    }

    LevelMap lm;
    lm.name = "Random Map";
    lm.map = mapG;
    lm.size = size;

    for (int i = 0; i < 12; i++)
        doSimStep(lm);

    for (int i = 1; i < lm.size.x - 2; i++)
    {
        for (int j = 1; j < 12+groundLevel; j++)
        {
            if (lm.map[1][i][j] == '0') // PART WHERE THE ERROR IS
                continue;
            else
            {
                lm.map[1][i][j] = 'g';
                lm.map[2][i][j-1] = 'w';
                i++;
                j = 1;
            }
        }
    }

    for (int i = 1; i < lm.size.x - 2; i++)
    {
        for (int j = groundLevel; j < lm.size.y - 2; j++)
        {
            if (lm.map[1][i][j] == 'd')
            {
                if (rand()%120 == 0)
                    lm.map[2][i][j] = 'p';
            }
        }
    }

    for (int i = 0; i < lm.size.y; i++)
    {
        lm.map[1][0][i] = 'X';
        lm.map[1][lm.size.x-2][i] = 'X';
        lm.map[2][0][i] = '0';
        lm.map[2][lm.size.x-2][i] = '0';

    }

    for (int i = 0; i < lm.size.x; i++)
    {
        lm.map[1][i][0] = 'X';
        lm.map[1][i][lm.size.y-2] = 'X';
        lm.map[2][i][0] = '0';
        lm.map[2][i][lm.size.y-2] = '0';

    }

    return lm;
}

最佳答案

除了错误信息外没有源代码

 if (v[i] == '0')

我只能想象 i >= v.size()

您可能需要考虑使用迭代器来访问您的 vector ,这样您就不会离开末尾。

关于c++ - 程序收到信号 EXC_BAD_ACCESS - Mac OS X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045180/

相关文章:

c++ - 定义我自己的新运营商

c++ - 是否设置数组的某些字段,将其他字段设置为零?

c++ - 为什么 Google C++ 风格指南推荐 PascalCase 函数名称?

c++ - 在 C++ 中用给定的字母打印三角形

Python C API : T_INT was not declared in this scope

c++ - while 循环和 if/else 语句不能正常工作

c++ - 具有不同返回类型的 Eigen 系数明智运算符

c++ - boost::mutex 和 boost::timed_mutex 的区别

c++ - 如何在类外声明一个函数?

c++ - 使用 vector 的基本 C++ 函数