Visual studio-启用优化会导致崩溃



我在windows 8上使用visual studio 2012,以及2012年11月的CTP
当我运行启用了优化(/o2)的c++应用程序的发布版本时,它会崩溃
它发生在std::vector中(不过这不是我第一次使用vector)
深入代码,我发现第二次执行push_back时,这里是:

1197 if (this->_Mylast == this->_Myend)
1198     _Reserve(1);

如果我遵循_Reserve,则从1开始的count的值将变为17656451,从而在稍后调用recallocate时导致错误(我禁用了异常)
在调试模式下运行时,一切正常。此外,禁用优化的发布模式运行良好
可能是因为编译器是测试版本吗?我正在使用一些新功能,所以我无法切换回来尝试。

编辑:

这是代码的一部分
我有两个结构:

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

第2版:

这是一个更完整的代码部分->链接

我试图将问题本地化,以下是我的发现
删除第113行的矢量似乎没有效果,但在第18行注释矢量(以及写入/读取它的代码)以某种方式解决了问题
不过有一个问题,现在我从第297行得到一个错误,在加载所有瓦片后,我对它们进行了排序。这个问题通过在288-292处评论for循环来解决。
无论如何,我仍然不明白为什么。

我的水晶球显示,您对附近存储的另一个变量的缓冲区访问超出范围,这会损坏std::vector的元数据。

然后我问魔术8球是否可能是超频导致的硬件故障,但的回答是"不太可能">

我终于找到了罪魁祸首
我将XMVECTOR(DirectX数学库)直接存储在Tile结构中。

文档明确指出应避免这样做
所以我所做的是存储一个XMFLOAT4,并在需要值时将其加载到XMVECTOR中。

我仍然不明白为什么它会产生访问冲突,但我想这是向量的内部表示(在我的例子中是__m128)、数学库的优化以及std::vector内部发生的未初始化移动的组合?

最新更新