wxWidgets内置图片函数无法加载大PNG?内存分配问题求助
wxWidgets加载超大PNG图片内存分配失败的解决方案与问题分析
问题分析
29000x29000像素的PNG无法被wxWidgets 3.1.4内置图片处理器加载,虽然通过了src\png\png.c中png_check_IHDR()函数的尺寸检查(PNG_UINT_31_MAX和user_width_max/user_height_max都远大于29000),但在wxImage::Create()中调用malloc(width*height*3)时内存分配失败,实际传入malloc的数值远大于预期的2523000000。
核心原因是整数溢出:width和height的类型为32位有符号int,29000×29000=841000000,再乘以3得到2523000000,这个值超过了32位有符号int的最大值2147483647,导致计算结果溢出为一个错误的超大值,malloc收到非法参数后分配失败。
解决方案
你当前采用的强制类型转换方案是完全正确的:
malloc( ((size_t)width)*((size_t)height)*((size_t)3) )
将width、height和3都转换为size_t(无符号整数类型,宽度与系统指针一致,通常为64位),可以避免整数溢出,保证计算出正确的内存大小,让malloc成功分配所需内存。
版本修复与已知问题说明
这个整数溢出问题属于wxWidgets的已知bug,在3.1.5及之后的新版本中已经被修复,修复逻辑就是通过类型转换避免内存大小计算时的溢出。由于你使用的3.1.4版本未包含该修复,因此需要手动修改代码来解决问题。
内容的提问来源于stack exchange,提问作者Elmi
相关产品推荐
相关产品推荐

