C++無法分配大記憶體 當影像較大時,m和n是int類型時,char *a=new char[m*n]可能出現無法分配記憶體的錯誤 原因分析: 由於早期數據處理需求對記憶體需要較小,例如早期影像較小,影像長寬的積較小,char *a=new char[m*n]不會出錯。時代變化,影像體積變大,老代碼仍舊使 ...
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億,所以這個問題不明顯。
解決辦法:
- 完美解決辦法
將m和n定義為size_t類型。 - 一般解決辦法
將m和n定義為int64類型。足夠作為像素數量使用。