【发布时间】:2012-06-16 09:20:29
【问题描述】:
显然,由于日志文件中的以下消息,我的一个进程正在一遍又一遍地重新启动:
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$ 免费-m
total used free shared buffers cached
Mem: 32175 32113 61 0 412 24021
-/+ buffers/cache: 7679 24495
Swap: 12287 0 12287
这是因为空闲内存(当前缓存)非常少,但我猜为了迎合“新”请求,可以释放此缓存。或者我是否需要打开某些东西来强制释放缓存或这里出了什么问题?
【问题讨论】:
-
你知道你尝试分配多少内存吗?
-
你能调试一下吗?打破抛出异常并检查值是什么。可能是您要求的内存过多(例如 10Gb)或过少(负值)。它们都可能因
std::bad_alloc而失败。 -
当我尝试调试它并找出更多信息时,这里可能有用的一件事是我的系统在一个配置文件上工作,该文件具有要处理的类似事物的列表。 Uptil 大量的项目,系统工作正常。只有当我在此阈值之后添加时,此错误才会开始发生。所以我认为代码的基本正确性没有任何问题,例如尝试分配 -ve 内存或随机巨大的内存等。但这只是一个猜测。
-
您何时运行
free -m?除非您在Wed Jun 13 10:07:32 2012之前运行它,否则它不会告诉您分配失败时有多少可用内存。也许你的应用程序有大量的内存泄漏,当它终止时,所有这些当然都会被释放。它会正常工作,直到你的内存用完,然后抛出异常。 -
我使用 sar 命令来检查可用内存的历史记录和缓存的缓冲区,它们就像 24 GB(总 RAM 为 32 GB)..在这种情况下,很难理解为什么操作系统不能释放此缓存以满足“新”请求(并且还考虑到我在添加一个要处理的项目时遇到了这个问题——请阅读我之前的评论)
标签: c++ memory-management memory-leaks operating-system