当切换到向量而不是数组时,位图加载中断



在最近将我的程序从使用数组切换到创建缓冲区时,一个完全无关的问题浮出水面。此切换涉及创建std::vector<std::vector<std::vector<GLfloat> > > terrainMap;而不是GLfloat[size+1][size+1][4] terrainMap。为了初始化三维向量,我使用

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

这个"map"是许多类的参数,这些类通过void Terrain::Load(std::vector<std::vector<std::vector<GLfloat> > >& terrainMap,State &current){修改内容作为程序的设置。这是奇怪的部分,虽然,当为纹理创建一个完全不相关的位图时,会遇到断点,并进一步导致堆损坏。下面是图片加载的代码。

bmp = LoadBmp("dirt.jpg");

延伸到…

Bitmap Object::LoadBmp(const char* filename) {
Bitmap bmp = Bitmap::bitmapFromFile(ResourcePath(filename));
bmp.flipVertically();
return bmp;
} 

在这一点上bmp是正确的1600 × 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

您需要将像素数据保持在连续的缓冲区中,这意味着您需要一个大小为_width * _height * _format std::vector<GLfloat>,而不是向量的向量。

使用vector而不是数组不会为您节省索引算法。它会让你避免内存泄露,就像Ed s在评论中指出的那样。它允许你完全摆脱你的赋值操作符,因为编译器提供的默认复制赋值(和移动赋值)操作符会工作得很好。

最新更新