C++ 调整 2D 矢量内存大小错误

c++ resize 2D vector memory error

本文关键字:错误 内存 调整 2D C++      更新时间:2023-10-16

我有一个小类:头文件 - 网格.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;
};

实现 - 网格.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的矢量中停止了。

运行后出现错误消息:

测试网格中0x0028F249的首次机会异常.exe: 0xC0000005:访问违规读取位置0x00000038。未处理 测试网格.exe中0x0028F249异常:0xC0000005:访问 违规读取位置0x00000038。

我以前做过这些类型的2D操作,取得了巨大的成功。我尝试使用调整大小和push_back具有相同的结果。有人有提示吗?

问题出在以下几行上:

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);