C++大内存分配错误

发布时间 2023-12-25 23:15:09作者: Hdming

C++无法分配大内存

当影像较大时,m和n是int类型时,char *a=new char[m*n]可能出现无法分配内存的错误
原因分析:
由于早期数据处理需求对内存需要较小,例如早期影像较小,影像长宽的积较小,char *a=new char[m*n]不会出错。时代变化,影像体积变大,老代码仍旧使用int类型申请内存,将会出错。
m和n代表影像的长宽,m和n都是int类型,当m和n比较大时,例如m=50000,n=50000时,
此时m和n相乘结果为25亿,超出了32位int类型的最大值(约21亿),m*n被整体转换成类一个负数值(绝对值较小),new[size]当中的size默认是size_t类型的无符号整型,前面绝对值较小的负数被转换成了一个非常大的无符号正数,这个正数的大小远远超出了系统内存大小,因此无法分配成功;
以前影像的长宽没有这么大,像素不会超过21亿,所以这个问题不明显。
解决办法:

  1. 完美解决办法
    将m和n定义为size_t类型。
  2. 一般解决办法
    将m和n定义为int64类型。足够作为像素数量使用。