当我有这么多可用内存时,为什么会得到 std::bad_alloc

xyz*_*xyz 0 c++ operating-system memory-leaks memory-management

由于日志文件中的以下消息,我的一个进程显然一遍又一遍地重新启动:

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
Run Code Online (Sandbox Code Playgroud)

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

-bash-3.00$ 免费 -m

         total       used       free     shared    buffers     cached

Mem:         32175      32113         61          0        412      24021

-/+ buffers/cache:       7679      24495

Swap:        12287          0      12287 
Run Code Online (Sandbox Code Playgroud)

是不是因为可用内存(使用当前缓存)非常少,但我想为了满足“新”请求,可以释放此缓存。或者我是否需要打开某些东西来强制释放缓存或其他什么地方出了问题?

Roe*_*rel 5

这可能有几个原因,一个好的起点是知道您请求多少内存。

我可以想到发生这种情况的两个原因,即负大小或大大小(超过 4GB 的 32 位机器)的分配。或碎片问题(这可能发生在大量无分配调用之后,但并不常见。)

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

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

7 月 23 日 20:19:30 本地主机内核:0*4kB 0*8kB 0*16kB 1*32kB 0*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4kB) = 1099

==EDIT== 如何读取结果:当系统运行时,它将内存拆分为 4Mb (4096Kb) 的连续内存块。当您的系统分配内存时,这些块会被拆分成更小的大小,操作系统将分配两个内存块的最接近的幂。

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

在这样的情况下:“4*1024kB 0*2048kB 0*4096kB”虽然你有 4Mb 的空闲空间,但还是分成了 4 个 1Mb 的块。如果您要求操作系统分配 1 次 4 Mb,它将失败,因为 1 次分配必须返回连续内存。

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