映射中的特定键导致访问冲突错误,仅显示没有gdb

时间:2014-01-27 21:58:24

标签: c++ stl

我正在使用地图来存储字符的位图坐标,以便在从精灵表中呈现字符时使用。 坐标图定义为

typedef std::array<double,4> Coordinates;
typedef std::unordered_map<char, Coordinates> CharacterMapping;

我逐个提供坐标,如此

CharacterMapping *charMap = new CharacterMapping();
(*charMap)['a'][0] = 0; (*charMap)['a'][1] = 0; (*charMap)['a'][2] = 8; (*charMap)['a'][3] = 8;
(*charMap)['b'][0] = 8; (*charMap)['b'][1] = 0; (*charMap)['b'][2] = 16; (*charMap)['b'][3] = 8;
(*charMap)['c'][0] = 16; (*charMap)['c'][1] = 0; (*charMap)['c'][2] = 24; (*charMap)['c'][3] = 8;
(*charMap)['d'][0] = 24; (*charMap)['d'][1] = 0; (*charMap)['d'][2] = 32; (*charMap)['d'][3] = 8;
// and so on, including numbers and some other symbols...
(*charMap)['.'][0] = 49; (*charMap)['.'][1] = 32; (*charMap)['.'][2] = 55; (*charMap)['.'][3] = 40;
(*charMap)[' '][0] = 57; (*charMap)[' '][1] = 32; (*charMap)[' '][2] = 63; (*charMap)[' '][3] = 40;
(*charMap)[','][0] = 1; (*charMap)[','][1] = 40; (*charMap)[','][2] = 7; (*charMap)[','][3] = 48;

然后坐标被提供给我创建的类,(Drawable是一个容器类,带有一个指向形状对象的指针,表示一个可绘制对象,Shape是一个表示图形形状的抽象类,SpriteText是一个形状的子类)

SpriteText* spriteTextShape = new SpriteText(Vector(100,700), // position
            ltrTex, // the bitmap
            *charMap, // the map
            "hello world\nalso you\n1. it is ok, dont worry!\n2. what?"); // some text
Drawable *drw = new Drawable(world, // a container of all objects
            spriteTextShape); // the shape

只要我省略空格字符的坐标或在gdb下运行程序,这样就可以正常工作。 如果程序只是运行,它会在drawable构造函数行上以-1073741819访问冲突错误代码崩溃。 (通过在控制台中打印每一行来识别,不会进入构造函数本身。)

删除该行,将''替换为任何其他字符(如'\')或只是在gdb下运行它似乎解决了它。为什么在调用完全独立的类构造函数时,键值的更改会影响或导致访问冲突错误?使用gdb时怎么没出现?

ctors:

SpriteText::SpriteText(const Vector& position, Graphics::Texture* const texture,
                    const CharacterMapping& coordinates, const std::string& text) :
        Shape(position) {
    _charDrawer = new CharSprite(position, Vector(1,1), texture, coordinates, 'c');
    _text_info.line_info_r = NULL;
    setText(text);
}
CharSprite::CharSprite(const Vector& position, const Vector& dimensions,
    Texture* const texture, const CharacterMapping& coordinates,
    const char& character):
    Sprite(position,dimensions,texture){
    setSpriteCoordinates(coordinates);
    setCurrentCharacter(character);
}
Drawable::Drawable(World* world, Shape* shape):
    GameObject(world){
    setWorld(world);
    _shape = shape;
    _drawableFlags = Drawable::Flags::BOUND_BY_WORLD;
}

Windows xp,mingw和g ++。

0 个答案:

没有答案