成员声明中的位置打破代码?

时间:2014-01-28 06:10:31

标签: c++ line

前段时间我问了一个问题,为什么以下代码不起作用:

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:

// ...
}

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

1 个答案:

答案 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()

希望这有帮助。