通过指针调用方法时出现Segfault错误

时间:2013-08-28 06:03:08

标签: c++ pointers segmentation-fault

我有一个名为gridObject的基类

这是头文件:

#ifndef ITEM_H
#define ITEM_H

class gridObject
{
public:
    gridObject();
    virtual ~gridObject();

    virtual int get_GridID() = 0;

    virtual int get_x() = 0;
    virtual int get_y() = 0;

    virtual int get_direction() = 0;

    void set_x(int x);
    void set_y(int y);

    void set_direction(unsigned int direction);

protected:
private:
    int _x;
    int _y;

    unsigned int _direction;
};

#endif // ITEM_H

我有一个名为player

的子类

这是类文件中的get_GridID()方法:

int player::get_GridID() { return 2; }

还有一个网格类,通过二维矢量跟踪其上的所有对象。在头文件中,有那个向量:

private:
    vector<vector<gridObject*> > _position;

以下是分别在特定位置设置和获取对象的方法:

void grid::setGridPosition(int x, int y, gridObject* obj) { _position[y][x] = obj; }
gridObject* grid::getGridPosition(int x, int y) { return _position[y][x]; }

我遇到的问题是:

int main()
{
    grid * gr = new grid(10, 10);

    player p(0, 0, 100);

    gridObject * go = &p;

    gr->setGridPosition(0, 0, go);

    cout << gr->getGridPosition(0, 0)->get_GridID();

    return 0;
}

崩溃在:cout&lt;&lt; gr-&gt; getGridPosition(0,0) - &gt; get_GridID();

我已经包含了所有相应的头文件。

编辑:这是网格的构造函数和_position的初始化:

grid::grid(int width, int length)
{
    setSize(width, length);
}


void grid::setSize(int width, int length)
{
    setLength(length);
    setWidth(width);
}

void grid::setLength(int val) { _position.resize(val); }

void grid::setWidth(int val)
{
    for(unsigned int i = 0; i < _position.size() - 1; i++)
        for(unsigned int j = 0; j < _position.at(i).size() - 1; j++)
           _position.at(i).resize(val);
}

1 个答案:

答案 0 :(得分:0)

你正在使用矢量矢量:

vector<vector<gridObject*> > _position;

但是您初始化_position的方式如下:

_position.resize(length);
for(unsigned int i = 0; i < _position.size() - 1; i++)
    for(unsigned int j = 0; j < _position.at(i).size() - 1; j++)
       _position.at(i).resize(width);

请注意,resize类型的lengthvector<gridObject*>对象构造_position.at(i).resize(width);。然后你不是通过这些新构造的向量迭代,而是迭代它们的元素(第二个嵌套循环),在这种情况下导致行_position[y][x] = obj永远不会执行,因此grid::setSize尝试访问无效内存导致未定义的行为,您将其视为分段错误。

改为尝试(在_position.resize(length); for(unsigned int i = 0; i < _position.size() - 1; ++i) _position[i].resize(width); 中):

typedef

并考虑使用std::vector<gridObject*>为{{1}}创建别名:)