c++ resize 2D vector memory error

0

I have a small class: header file - 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;
};

implementation - 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;
}

And then the calling routine (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;
}

While running in debug mode in MSVS 2013, in SetGrid GridData.push_back(row)goes bad and I am halted in vector in bool _Inside(const value_type *_Ptr) const.

Error message after run:

First-chance exception at 0x0028F249 in testgrid.exe: 0xC0000005: Access violation reading location 0x00000038. Unhandled exception at 0x0028F249 in testgrid.exe: 0xC0000005: Access violation reading location 0x00000038.

I have done these type of 2d manipulations before with great success. I have tried using resize and push_back with same result. Does anyone have a hint?

c++
vector
asked on Stack Overflow Feb 29, 2016 by Erik Thysell

1 Answer

1

The problem lies with the lines:

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

From http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr:

The default constructor

Constructs a shared_ptr with no managed object, i.e. empty shared_ptr

Use

std::shared_ptr<Grid> NoiseGrid(new Grid);
NoiseGrid->SetGrid(NoiseArray, nx, ny);
answered on Stack Overflow Feb 29, 2016 by R Sahu

User contributions licensed under CC BY-SA 3.0