会员声明中的位置打破代码

Position in Member Declaration Breaks Code?

本文关键字:代码 位置 声明      更新时间:2023-10-16

不久前我问了一个问题,说明为什么以下代码不起作用:

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 Studios 2012会引发例外。例外指的是这件代码:

*_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:
// ...
}

指出出了什么问题的任何帮助?我无法提出任何合理的解释。

a vector<T>包括两个离散的数据集:内部状态和ts数组。内部状态 - 容量,大小,指针 - 与数组分开。您所描述的问题通常是由覆盖 vector对象(即内部状态)的东西引起的。要轻松地跟踪此操作,您可以使用一个容器类:

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()时。

希望这会有所帮助。