当我有足够的可用内存时,为什么我得到std :: bad_alloc

时间:2012-06-13 12:08:18

标签: c++ memory-management memory-leaks operating-system

由于日志文件中包含以下消息,我的一个进程显然是重复重启:

Wed Jun 13 10:07:32 2012: terminate called after throwing an instance of 'std::bad_alloc'

Wed Jun 13 10:07:32 2012:   what():  St9bad_alloc

我知道这是因为它无法为“新”请求分配内存。我不明白的是'free -m'告诉我很多可用内存可用于丢弃缓存:

-bash-3.00 $ free -m

         total       used       free     shared    buffers     cached

Mem:         32175      32113         61          0        412      24021

-/+ buffers/cache:       7679      24495

Swap:        12287          0      12287 

它是否因为可用内存(使用当前缓存)而非常少,但我猜想为了满足'新'请求,可以释放此缓存。或者我是否需要打开一些东西以强制释放缓存或其他东西在这里出错?

1 个答案:

答案 0 :(得分:3)

这可能是一些原因,一个好的起点是知道你要求多少内存。

我可以想到发生这种情况的两个原因,即负面大小的分配或大尺寸的分配(超过4GB的32位机器)。或者是一个碎片问题(这可能发生在很多免费拨号电话之后,但并不常见。)

要查看内存碎片,您可以使用神奇的SysRq密钥。只需执行以下命令:

echo m>的/ proc / sysrq的触发 此命令将当前内存信息转储到/ var / log / messages。以下是RHEL3 32位系统的示例:

  

Jul 23 20:19:30 localhost内核:0 * 4kB 0 * 8kB 0 * 16kB 1 * 32kB 0 * 64kB   1 * 128kB 1 * 256kB 1 * 512kB 1 * 1024kB 0 * 2048kB 0 * 4096kB = 1952kB)

== EDIT == 如何读取结果:当系统上升时,它将内存分成4Mb(4096Kb)的连续内存块。当你的系统分配内存时,这些块被分割成更小的大小,操作系统将分配最接近两个内存块的功率。

所以“1 * 1024kB”意味着系统中有一块1 Mb的连续内存。

如果像“4 * 1024kB 0 * 2048kB 0 * 4096kB”,虽然你确实有4Mb免费,但是分成4个1Mb块。如果您要求操作系统分配4 Mb,它将失败,因为1分配必须返回连续内存。

我希望这对你有意义( - ;