C/C++ 語言裏, 絕大部分平臺上 int 類型是 32 位的, 無論你的操作系統是否是 64 位的. 而一些常用的函數, 如 malloc(), 它接受的參數是 size_t 類型:
void * malloc ( size_t size );
如果你寫出這樣的代碼:
int mb = 3000; // 3000MB ~= 3GB void *p = malloc(mb * 1024 * 1024); // WRONG!
這是非常危險的, 因為那個乘法得到的結果也是 int 類型, 但已經溢出了, 所以
mb * 1024 * 1024 = -1073741824;
然後
malloc(-1073741824) = malloc((size_t)-1073741824);
在 64 位系統裏, size_t 是 64 位正整數, 所以
(size_t)-1073741824 = 18446744072635809792
相當於你試圖分配那麽多內存! 遠遠超出你的相像. 我在 SSDB 項目裏就踩到過幾次這種坑! 所以, 記住
小心乘法運算!
Tags: nbsp 乘法 1073741824 malloc size_t 所以
文章來源: