前段时间我问了一个问题,为什么以下代码不起作用:
std::vector<std::vector<std::vector<Tile_Base*>>> map_tile; // This is located in Map object. See below.
int t_x, t_y;
t_x = t_y = 200;
map_tiles.begin(); // clear(), resize() and every other function still causes problems
问题是它应该有效,但Visual Studio 2012在调用resize函数时抛出异常。这段代码指出了异常:
*_Pnext != 0; *_Pnext = (*_Pnext)->_Mynextiter)
位于xutility。它说在阅读内存时存在违规行为。我想也许某种程度上我失去了对会员的访问权限? (使用VS'监视我看到内存没有损坏)
所以,我摆弄代码并试图找出可能出错的地方,过了一段时间后我将map_tiles对象移到了列表的底部,并且它有效:
// WORKS
class Map {
std::vector<Tile_Base*> spawn_tiles;
// map tile specific
bool Is_Valid(int,int);
std::string name;
std::vector<std::vector<std::vector<Tile_Base*> > > map_tiles;
public:
// ...
}
// DOESN'T WORK
class Map {
std::vector<std::vector<std::vector<Tile_Base*> > > map_tiles;
std::vector<Tile_Base*> spawn_tiles;
// map tile specific
bool Is_Valid(int,int);
std::string name;
public:
// ...
}
任何帮助指出出了什么问题?我无法提出任何合理的解释。
答案 0 :(得分:1)
A vector<T>
包含两组离散数据:内部状态和Ts数组。内部状态 - 容量,大小,指针 - 与数组分开。您所描述的问题通常是由覆盖矢量对象的内容引起的,即内部状态。要轻松跟踪此问题,您可以使用容器类:
typedef std::vector<std::vector<std::vector<Tile_Base*> > > maptiles_t;
class CMapTiles
{
unsigned int m_guard;
maptiles_t m_tiles;
enum { Guard = 0xdeadbeef };
public:
CMapTiles() : m_guard(Guard), m_tiles() {}
~CMapTiles() { assert(m_guard == Guard); }
void Check()
{
#if defined(DEBUG)
if (m_guard != Guard)
DebugBreak();
#endif
}
void Resize(size_t x, size_t y)
{
Check();
auto init = std::vector<std::vector<Tile_Base*> >(y/32);
m_tiles.resize(m_x / 32, init);
Check();
}
const maptiles_t& tiles() const { Check(); return m_tiles; }
maptiles_t& tiles() { Check(); return m_tiles; }
};
而不是使用std::vector<...> map_tiles
使用CMapTiles map_tiles
,然后当您想要获取向量时,map_tiles.tiles()
。
希望这有帮助。