我有一个小班: 头文件 - 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,结果相同。 有人有提示吗?
答案 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);