【问题标题】:SIGKILL while allocating memory in C++ using calloc使用 calloc 在 C++ 中分配内存时发出 SIGKILL
【发布时间】:2014-06-25 08:52:09
【问题描述】:

这个问题是Why does malloc() or new never return NULL?SIGKILL while allocating memory in C++的后续问题:

从那里的答案我可以理解为什么程序在尝试写入由malloc“成功”分配的内存时会被杀死。但是,在使用 calloc(在 SLC 和 Ubuntu 上)时,我看到了同样的问题:

程序不是返回一个空指针,而是SIGKILLed,所以检查calloc的返回值是徒劳的。但是calloc 应该不会受到“overcommit 特性”的影响吧? (除非它在幕后依赖malloc...)

【问题讨论】:

  • 您为什么认为calloc 不会依赖malloc?当然,它必须 - 但自然实现显然是作为malloc 的薄包装。
  • 我没想到。它不必,即使知道它确实如此,它也可能不允许malloc 返回没有由“真实”内存备份的内存。 (这取决于/proc/sys/vm/overcommit_memory 中的设置在游戏中的位置。)

标签: memory-management calloc sigkill


【解决方案1】:

来自proc/proc/sys/vm/overcommit_memory部分

系统上当前分配的内存量。提交的内存是进程分配的所有内存的总和,即使它还没有被它们“使用”。分配 1GB 内存的进程(使用malloc(3) 或类似),但仅触及该内存的 300MB 将仅显示为使用 300MB 内存,即使它具有为整个分配的地址空间1GB。这 1GB 是 VM 已“承诺”使用的内存,可随时由分配应用程序使用。在系统上启用严格过量使用(模式 2 /proc/sys/vm/overcommit_memory)后,将不允许超过 CommitLimit(如上详述)的分配。如果需要保证在成功分配内存后进程不会因内存不足而失败,这将非常有用。

虽然只明确列出了malloc,但它确实说相似calloc(和realloc)是相似。在这个问题上它和malloc有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2013-12-21
    相关资源
    最近更新 更多