通过指针调用方法时出现段错误
Posted
技术标签:
【中文标题】通过指针调用方法时出现段错误【英文标题】:Segfault error when calling a method through pointer 【发布时间】:2013-08-28 06:03:08 【问题描述】:我有一个名为 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 getGridPosition(0, 0)->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);
【问题讨论】:
你应该尝试删除所有不相关的代码,并添加相关的代码,这是缺失的。例如,您如何初始化_position
?你的构造函数和析构函数是做什么的?
尤其是getGridPosiion()
和setGridPosition()
。请注意,如果您有一个由成员函数触发的故障,那么所述成员应该始终在您发布的代码片段中。
添加了构造函数和初始化
是的,它只是一个嵌套向量。这不会导致索引越界错误吗?
不,如果索引在 [0;向量.size()-1]。但你实际上只是初始化范围 [0; vector.size()-2].
【参考方案1】:
您正在使用向量的向量:
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
构造 length
类型为 vector<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*>
创建别名:)
【讨论】:
我在 stl_vector.h 中遇到错误:错误:从 'int' 到 'std::vector以上是关于通过指针调用方法时出现段错误的主要内容,如果未能解决你的问题,请参考以下文章