C++ 切换到阵列上的向量时位图加载中断

C++ 切换到阵列上的向量时位图加载中断,c++,arrays,image,vector,C++,Arrays,Image,Vector,在最近的一次更改中,在创建缓冲区时,我的程序从使用数组切换到使用向量,出现了一个完全不相关的问题。此开关涉及创建std::vector 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

在最近的一次更改中,在创建缓冲区时,我的程序从使用数组切换到使用向量,出现了一个完全不相关的问题。此开关涉及创建
std::vector 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);
    }
延伸到

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);
}
位图和位图::运算符=(常量位图和其他){
_设置(其他。\宽度、其他。\高度、其他。\格式、其他。\像素);
归还*这个;
}
无效位图::_集(无符号宽度,
无符号高度,
格式,
常量无符号字符*像素)
{
如果(宽度==0)抛出std::runtime_错误(“零宽度位图”);
如果(高度==0)抛出std::runtime_错误(“零高度位图”);
如果(格式4)抛出std::runtime_错误(“无效位图格式”);
_宽度=宽度;
_高度=高度;
_格式=格式;
大小\u t新闻大小=\u宽度*\u高度*\u格式;
如果(_像素){
_像素=(无符号字符*)realloc(_像素,新闻大小);
}否则{
_像素=(无符号字符*)malloc(新闻大小);
}
如果(像素)
memcpy(_像素,像素,新闻大小);
}
图像找到了
\u pixels=(unsigned char*)realloc(\u pixels,newSize)其中_像素的内容指向无法读取的内存。
让我感到奇怪的是,如何将三维数组更改为三维向量导致了这个问题。两者之间没有相互作用。非常感谢您的帮助。

当然,您需要将像素数据保存在一个连续的缓冲区中,这意味着您需要一个大小为
\u width*\u height*\u format
std::vector
,而不是矢量的矢量


使用
vector
代替数组不会使您免于索引算法。它将使你免于像Ed S.在评论中指出的那样出现内存泄漏。它将允许您完全摆脱赋值运算符,因为编译器提供的默认复制赋值(和移动赋值)运算符将非常有效。

提供类定义而不仅仅是三维向量如何。一个好主意真的会派上用场。此外,这个三维向量肯定不会将所有分配存储在一个连续的块中,所以任何可以读取或写入的想法都不会起作用。最后,是否有一个可靠的构造函数定义,当它与未初始化的位图或零大小的位图关联时,可以确保
\u像素
为空?如果不是,则使用伪指针调用
realloc()
。如果是这样,测试本身就毫无意义;realloc()将正确使用NULL。对
realloc
的调用错误。如果
realloc
失败,则会因为丢失了原始指针而导致内存泄漏。将返回值指定给临时值,检查是否为NULL,然后将其指定给
\u像素
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);
}