我在Windows 8和2012年11月的CTP上使用visual studio 2012 当我在启用了优化(/ o2)的情况下运行我的c ++应用程序的发布版本时,它会崩溃 它发生在std :: vector中(虽然我第一次使用矢量) 踩到代码里面我发现第二次做push_back,在这里:
1197 if (this->_Mylast == this->_Myend)
1198 _Reserve(1);
如果我按照_Reserve,count的值从1变为17656451,稍后当它调用reallocate时会导致错误(我禁用异常)。
在调试模式下运行时一切都很好。禁用优化的释放模式也正常运行
可能是因为编译器是测试版本?我正在使用一些新功能,所以我无法切换回来尝试。
编辑:
以下是代码的一部分 我有两种结构:
struct Subtile
{
int sequenceId;
AnimationSequenceState sequenceState;
XMFLOAT2 position;
};
struct Tile
{
//int type;
bool visible;
bool walkable;
int x, y;
int height;
XMFLOAT2 position;
float depth;
XMVECTOR color;
std::vector<Subtile> subtiles;
};
当从lua文件解析游戏的2d地图时,从循环内部调用此函数:
HRESULT Map::parseTile(LuaState& l, int ix, int iy, XMFLOAT2 pos)
{
Tile tile;
tile.visible = l.getBoolField(-1, parsing::MapTileVisible, true);
tile.walkable = l.getBoolField(-1, parsing::MapTileWalkable, true);
tile.height = l.getIntField(-1, parsing::MapTileHeight, 0);
bool sync = l.getBoolField(-1, parsing::MapTileSync, true);
tile.x = ix;
tile.y = iy;
tile.position.x = pos.x;
tile.position.y = pos.y;
tile.depth = -static_cast<float>(ix + iy);
tile.color = XMVectorSet(1.0f, 1.0f, 1.0f, 1.0f);
l.pushString(parsing::MapTileSubtiles);
l.getTable();
{
for(l.pushNil(); l.next(); l.pop())
{
Subtile subtile;
subtile.sequenceId = l.toInt();
_sequences[subtile.sequenceId].update(subtile.sequenceState);
if(!sync)
{
subtile.sequenceState.elapsed = rand() % 1000; //一秒、適当に
}
tile.subtiles.push_back(subtile);
}
}
l.pop();
_tiles.push_back(tile); //second time crashes here
return S_OK;
}
EDIT2:
以下是代码中更完整的部分 - &gt; LINK
我试图将问题本地化,这就是我找到的
在第113行删除向量似乎没有效果,但是,在第18行(以及写入/读取它的代码)注释向量会以某种方式解决它。
虽然有一个问题,现在我从第297行得到一个错误,在加载所有瓷砖后我对它们进行排序。通过在288-292处评论for循环,这个问题就消失了
无论如何,我仍然不明白为什么。
答案 0 :(得分:1)
我的水晶球显示您在附近存储的另一个变量中有超出范围的缓冲区访问权限,这会破坏std::vector
的元数据。
然后我问魔术8球是否可能是超频引起的硬件故障,但响应是“不太可能。”
答案 1 :(得分:1)
我终于找到了罪魁祸首 我直接在Tile结构中存储XMVECTOR(DirectX Math库)。
文件明确规定应避免这样做 所以我做的是存储XMFLOAT4并在需要值时将其加载到XMVECTOR中。
我仍然不明白为什么它会给出访问冲突但是,我认为是向量的内部表示(在我的例子中,__ m128),数学库的优化和std内部发生的未初始化的移动的组合::矢量?