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