bool primeNums[100000000];
用完所有stack
空间,因此,由于没有足够的堆栈空间来分配具有巨大大小的静态数组,因此会出现分段错误。
动态数组分配在 上heap
,因此,不容易出现分段错误。动态数组是new
在 C++ 中创建的,它会调用operator new
分配内存然后调用构造函数来初始化分配的内存。
有关如何operator new
工作的更多信息,请参阅以下标准 [new.delete.single]:
要求的行为:
将非空指针返回到适当对齐的存储(3.7.3),否则抛出 bad_alloc 异常。此要求对该功能的替换版本具有约束力。
默认行为:
— 执行循环:在循环内,函数首先尝试分配请求的存储空间。未指定尝试是否涉及对标准 C 库函数 malloc 的调用。
— 如果尝试成功,则返回指向已分配存储的指针。否则,如果 set_new_handler() 的最后一个参数是空指针,则抛出 bad_alloc。
— 否则,该函数调用当前的 new_handler (18.4.2.2)。如果被调用的函数返回,则循环重复。
— 当尝试分配请求的存储成功或调用的 new_handler 函数没有返回时,循环终止。
所以使用动态数组new
,当空间不够时,bad_alloc
默认会抛出,在这种情况下,你会看到一个异常而不是分段错误,当你的数组很大时,最好使用动态数组或标准容器比如向量。