最近在创建缓冲区时将程序从使用数组转换为向量的更改中,出现了一个完全不相关的问题。此切换涉及创建std::vector<std::vector<std::vector<GLfloat> > > terrainMap;
而不是GLfloat[size+1][size+1][4] terrainMap
。要初始化3-D矢量,我使用
terrainMap.resize(size+1);
for (int i = 0; i < size+1; ++i) {
terrainMap[i].resize(size+1);
for (int j = 0; j < size+1; ++j)
terrainMap[i][j].resize(4);
}
这个&#34;地图&#34;是一个许多类的参数,它通过void Terrain::Load(std::vector<std::vector<std::vector<GLfloat> > >& terrainMap,State ¤t){
修改内容作为程序的设置这是奇怪的部分,但是当为纹理创建一个完全不相关的位图时,会出现一个断点并进一步导致堆损坏。这是图像加载的代码。
bmp = LoadBmp("dirt.jpg");
延伸到......
Bitmap Object::LoadBmp(const char* filename) {
Bitmap bmp = Bitmap::bitmapFromFile(ResourcePath(filename));
bmp.flipVertically();
return bmp;
}
此时bmp是正确的1600 x 1600大小,格式正确,RGB。但是,以下情况会导致故障。
Bitmap& Bitmap::operator = (const Bitmap& other) {
_set(other._width, other._height, other._format, other._pixels);
return *this;
}
void Bitmap::_set(unsigned width,
unsigned height,
Format format,
const unsigned char* pixels)
{
if(width == 0) throw std::runtime_error("Zero width bitmap");
if(height == 0) throw std::runtime_error("Zero height bitmap");
if(format <= 0 || format > 4) throw std::runtime_error("Invalid bitmap format");
_width = width;
_height = height;
_format = format;
size_t newSize = _width * _height * _format;
if(_pixels){
_pixels = (unsigned char*)realloc(_pixels, newSize);
} else {
_pixels = (unsigned char*)malloc(newSize);
}
if(pixels)
memcpy(_pixels, pixels, newSize);
}
图像找到_pixels = (unsigned char*)realloc(_pixels, newSize);
的路径,其中_pixels的内容指向不可读的内存。
令我感到奇怪的是,如何将3-D阵列更改为3-D向量会导致此问题。两者之间没有相互作用。任何帮助深表感谢。
Behemyth
答案 0 :(得分:0)
您需要将像素数据保存在连续的缓冲区中,这意味着您需要一个<{em> std::vector<GLfloat>
大小为_width * _height * _format
而不是向量的向量。
使用vector
代替数组不会使您免于索引算术。它可以帮助您避免内存泄漏,就像Ed S.在评论中指出的那样。它将允许您完全摆脱您的赋值运算符,因为编译器提供的默认副本赋值(和移动赋值)运算符将运行良好。