类向量中的c ++ segfault

时间:2018-11-18 03:57:42

标签: c++ vector segmentation-fault

我一直在玩c ++游戏,只是为了练习编程。我创建了一个类,该类本质上是一个二维的细胞矢量,它们充当地牢的不同图块。当我尝试调用将边缘单元变成壁的函数时,我遇到了段错误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();
 }
}

什么是导致段错误11的原因?我所做的测试表明,我的程序将其设置为setwalls(),但它似乎在尝试访问布局矢量的第一个元素时就会遇到段错误。

2 个答案:

答案 0 :(得分:1)

您做错了几件事,所以我为您编写了一个有关如何使用多维向量的示例。

#include<vector>
   #include<iostream>

 using namespace std;

 int main()
 {
     vector < vector < int >>myarr;

     myarr.resize(100);         // resizes 1st dimension 
     for (auto i = 0; i < 100; i++)
    myarr[i].resize(100);   // resizes 2nd dimension

// initilization
for (int i = 0; i < 100; i++)
    {
    for (int j = 0; j < 100; j++)
        myarr[i][j] = j;    // 0- 99 100 times.
     }

     for (int i = 0; i < 100; i++)
     {
    for (int j = 0; j < 100; j++)
              cout << myarr[i][j] << " ";

        cout << endl;
     }
 }

您没有正确调整向量的大小,也没有正确初始化向量的使用方式。同样,您的类型应该是std :: unique_ptr,并用std :: make_unique初始化它,并且两者都位于内存头中。

您的代码应为

 int main(){
     floor myfloor(18,9);
     myfloor.setwalls();
 }

 #ifndef FLOOR_H
#define FLOOR_H
#include "cell.h"
 #include <vector>
 #include<memory>

 using namespace std;
 class floor{
 public:
     floor(int xmax, int ymax);
      void setwalls();
 private:
      int sizeX;
      int sizeY;
      vector<vector<unique_ptr<cell*>>> layout;
 };
 #endif

 floor::floor(int xmax, int ymax){
     sizeX = xmax;
     sizeY = ymax;
     layout.resize(xmax);

     for(int i = 0; i < xmax; i++)
          layout[i].resize(ymax);

     for(int i = 0; i < xmax; i++){
         for(int j = 0; j < ymax; j++){
             layout[i][j] = make_unique(cell());
         }
      }
 }
 void floor::setwalls(){
     for(int i = 0; i < sizeY; i++){
         layout[0][i]->setwall();
         layout[sizeX - 1][i]->setwall();
     }
     for(int i = 0; i < sizeX; i++){
         layout[i][0]->setwall();
         layout[i][sizeY - 1]->setwall();
  }
 }

现在,您的董事会将是您想要的两个方面的规模。

答案 1 :(得分:-1)

索引基于0。因此,bounds的有效值为0 <= bound <=(N-1)。

您需要使用sizeX-1而不是sizeX。与sizeY相同。​​