【发布时间】:2018-11-18 03:57:41
【问题描述】:
我一直在玩用 C++ 制作游戏,只是为了练习编程。我创建了一个类,它本质上是一个 2d 单元格向量,用作地牢的不同图块。当我尝试调用我的函数将边缘单元格变成墙时,我得到一个段错误 11。根据我的研究,错误是试图访问超出向量范围的元素,或者我已经用完了堆内存但我不确定这里是否属于这种情况。
int main(){
floor myfloor(18,9);
myfloor.setwalls();
}
#ifndef FLOOR_H
#define FLOOR_H
#include "cell.h"
#include <vector>
using namespace std;
class floor{
public:
floor(int xmax, int ymax);
void setwalls();
private:
int sizeX;
int sizeY;
vector< vector<cell*> > layout;
};
#endif
floor::floor(int xmax, int ymax){
sizeX = xmax;
sizeY = ymax;
layout.resize(xmax, vector<cell*>(ymax));
for(int i = 0; i < xmax; i++){
for(int j = 0; j < ymax; j++){
layout[i][j] = new cell();
}
}
}
void floor::setwalls(){
for(int i = 0; i < sizeY; i++){
layout[0][i]->setwall();
layout[sizeX][i]->setwall();
}
for(int i = 0; i < sizeX; i++){
layout[i][0]->setwall();
layout[i][sizeY]->setwall();
}
}
是什么导致了这里的 segfault 11?我所做的测试表明我的程序可以到达 setwalls() 但它似乎会在尝试访问布局向量的第一个元素时立即出现段错误。
【问题讨论】:
-
越界访问或空指针取消引用。
-
layout[sizeX][i]和layout[i][sizeY]超出范围 -
我建议您不要使用
sizeX、sizeY等无关变量来表示向量中的条目数。向量通过使用vector::size()函数知道自己的大小——不需要通过使用不必要的变量来实现冗余。通过使用不必要的变量(例如sizeX和sizeY),如果向量碰巧改变了大小并且您没有更新sizeX或sizeY,那么您就有可能在代码中引入错误。 -
另外,如果
floor的第一个参数为 0,则所有其他函数都将失败,因为向量为空。
标签: c++ vector segmentation-fault