char* p = new char[1024*1024*1024*1024*1024]; // 1 PB
// 不拋 bad_alloc,p 非 null
1024*1024*1024*1024*1024 為 int 字面常數運算,32 位元有號整數溢位,結果為 0。new char[0] 依 C++ 標準允許,回傳非 null 唯一指標(不分配儲存空間)。p[0] 即屬未定義行為 (UB)。#include <iostream>
#include <cstddef>
int main() {
size_t sz = 1024*1024*1024*1024*1024; // 依然溢位,需加 ULL
std::cout << "sz = " << sz << '\n'; // 輸出 0
size_t sz2 = 1024ULL*1024*1024*1024*1024; // 正確 1 PB
std::cout << "sz2 = " << sz2 << '\n'; // 1125899906842624
// 實際分配 1 PB 會拋 std::bad_alloc (記憶體不足)
try {
char* p = new char[sz2];
std::cout << "allocated (unexpected)\n";
delete[] p;
} catch (std::bad_alloc&) {
std::cout << "bad_alloc as expected\n";
}
}
size_t 或 uint64_t 字面常數:1024ULL * 1024 * 1024 * 1024 * 1024。new 失敗會拋異常,nothrow 版本才回傳 null)。32 位元程式最大位址空間 4 GB,64 位元理論 16 EB,受限於實體 RAM + 頁面檔。單次 new 申請超大塊易失敗,建議使用 std::vector 配合 reserve 或分批分配。