c ++调整2D矢量内存错误

时间:2016-02-29 06:25:26

标签: c++ vector

我有一个小班: 头文件 - Grid.h:

class Grid
{
public:
  Grid();
  ~Grid();
  bool WriteGridToDSGrdFile(char* FileName);
  bool SetGrid(float *noisearray, int nx, int ny);
private:
  std::vector<std::vector<float>> GridData;
};

实现 - Grid.cpp

bool
Grid::SetGrid(float* noisearray, int nx, int ny)
{
  for (size_t ix = 0; ix < nx; ix++)
  {
    std::vector<float> row;
    GridData.push_back(row);
    GridData[ix].resize(ny);
    for (size_t iy = 0; iy < ny; iy++)
    {
      GridData[ix].push_back(noisearray[ix*ny + iy]);
    }
  }
  return true;
}

然后调用例程(testgrid.cpp):

int _tmain(int argc, _TCHAR* argv[])
{
  int nx = 20; 
  int ny = 10;
  float *NoiseArray = new float[nx*ny];
  std::shared_ptr<Grid> NoiseGrid;
  NoiseGrid->SetGrid(NoiseArray, nx, ny);
  return 0;
}

在MSVS 2013中以调试模式运行时,SetGrid GridData.push_back(row)变坏了,我在bool _Inside(const value_type *_Ptr) const的矢量中停止。

运行后的错误消息:

  

testgrid.exe中0x0028F249的第一次机会异常:   0xC0000005:访问冲突读取位置0x00000038。未处理   testgrid.exe中的0x0028F249异常:0xC0000005:Access   违规读取位置0x00000038。

我之前完成了这些类型的2D操作并取得了巨大的成功。我尝试过使用resize和push_back,结果相同。 有人有提示吗?

1 个答案:

答案 0 :(得分:1)

问题出在以下几行:

std::shared_ptr<Grid> NoiseGrid;
NoiseGrid->SetGrid(NoiseArray, nx, ny);

来自http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

默认构造函数

  

构造一个没有托管对象的shared_ptr,即空shared_ptr

使用

std::shared_ptr<Grid> NoiseGrid(new Grid);
NoiseGrid->SetGrid(NoiseArray, nx, ny);