![]() |
1
19
另一个可能的问题是,虽然您提到程序使用的空间小于5MB,但您没有提到它试图分配多少空间。你可能有一些竞争条件破坏了你用来确定分配大小的值,它可能会试图分配37tb或诸如此类的胡说八道。 我想不太可能,但值得一看。 |
![]() |
2
21
当有一个bug正在覆盖堆用来管理用来分配的内存池的指针时,也可以抛出bad_alloc。 最常见的原因是,您是在分配的内存块结束后(或在开始之前)写入,但这不太常见。几乎和释放内存块后写入内存块一样常见。这称为堆损坏。 另外,我应该注意到,windows中的32位进程最多有2GB的地址空间(3GB用于大型地址感知程序)。不管您安装了多少ram,内存都是虚拟的,即使只有1gb的ram,分配也不会失败,直到您耗尽地址空间。 下面是C++中内存损坏的一个很好的讨论 http://www.eventhelix.com/RealtimeMantra/Basics/debugging_software_crashes_2.htm |
![]() |
3
3
很少有澄清: Windows中的每个进程都有4GB的虚拟内存,其中2GB用于用户空间,其余用于内核空间。4gb的ram不会贡献给虚拟内存,而是用于物理内存。 在2GB内存中,所有的EXE、DLL都被加载,几乎没有1.6-1.7GB的内存可供分配。在此内存中,如果没有可供分配的连续内存,则内存分配将失败。 |
![]() |
4
1
其他代码也可以抛出bad_alloc。 我见过一个为stl容器设计的限制内存池使用它。当达到大小限制时,它抛出了错误的分配,软件只能处理它。 |
![]() |
5
1
我以前确实遇到过这个问题,通过清理和重建项目就解决了。当你有奇怪的行为时总是值得一试(除非它是一个需要几个小时才能编译的大型项目)。 |