std::bad_alloc异常触发原因及Windows 10堆内存分配机制问询
Windows 10下C++堆内存分配与std::bad_alloc触发场景
Windows 10中C++应用堆内存分配步骤
- 当C++代码调用
new或malloc时,会间接调用Windows底层堆分配API(如HeapAlloc,默认使用GetProcessHeap获取的进程堆)。 - 操作系统首先在进程的虚拟地址空间内查找足够大的连续空闲区域,标记为已占用。此时不会立即分配物理内存,而是采用“按需分页”机制。
- 当程序首次访问该虚拟内存区域时,CPU会触发页错误,Windows内核此时才会从物理内存中分配对应页,并完成虚拟地址到物理地址的映射。
- 若物理内存不足,Windows会通过**页面文件(pagefile.sys)**将部分不常用的物理内存页交换到磁盘,为新分配腾出物理空间。
相关参考资料:Windows SDK文档中关于堆管理(如HeapAlloc、GetProcessHeap)和虚拟内存管理的章节。
std::bad_alloc异常的触发场景
- 进程没有足够的连续虚拟地址空间用于分配内存:会触发
std::bad_alloc。此时底层分配API返回NULL,C++默认的new运算符会将分配失败转换为std::bad_alloc异常抛出。 - 操作系统没有足够的连续物理内存空间用于分配内存:通常不会直接触发
std::bad_alloc。Windows会通过页面文件置换物理内存页,只要进程虚拟地址空间足够,就能完成分配。只有当物理内存+页面文件的总可用空间耗尽时,才会导致分配失败进而触发异常,这种情况极为少见。 - 结论:
std::bad_alloc的主要触发场景是进程虚拟地址空间不足,单纯物理内存不足一般不会直接触发该异常。
内容的提问来源于stack exchange,提问作者LarsA
相关产品推荐
相关产品推荐

