据我所知,std::bad_alloc可能会被抛出的原因有三个:
对于小型图形(<= 100,000个顶点),程序运行得非常好,无论每个顶点的数据部分有多大(我们可以安全地分配总共高达40 GB的内存)。然而,如果顶点数量增加,即使使用“仅”8GB的内存,也会引发std::bad_alloc异常。
由于在分配更大的块内存时没有问题,因此排除了1和2的原因。我们有一些操作指针的区域,这种方式容易出错,因此我们可能会破坏堆数据结构。但是,在较小的实例上运行时,valgrind的memcheck显示我们的代码是完美的,因此这个原因也不太可能(在抛出异常的情况下,valgrind本身会耗尽内存,因此我们无法直接检查该情况)。
有什么其他原因可以解释这种行为的方法,或者我们可以运行什么测试以进一步确定问题?
操作系统:Fedora 19 构建系统:使用gcc 4.8.2的cmake
- 进程请求的内存超过了可用内存
- 地址空间过于分散,无法为大块连续内存提供服务
- 堆管理数据结构损坏
对于小型图形(<= 100,000个顶点),程序运行得非常好,无论每个顶点的数据部分有多大(我们可以安全地分配总共高达40 GB的内存)。然而,如果顶点数量增加,即使使用“仅”8GB的内存,也会引发std::bad_alloc异常。
由于在分配更大的块内存时没有问题,因此排除了1和2的原因。我们有一些操作指针的区域,这种方式容易出错,因此我们可能会破坏堆数据结构。但是,在较小的实例上运行时,valgrind的memcheck显示我们的代码是完美的,因此这个原因也不太可能(在抛出异常的情况下,valgrind本身会耗尽内存,因此我们无法直接检查该情况)。
有什么其他原因可以解释这种行为的方法,或者我们可以运行什么测试以进一步确定问题?
操作系统:Fedora 19 构建系统:使用gcc 4.8.2的cmake
bad_alloc
只会因为内存分配失败而被抛出。 - pmr