C语言 如何检查malloc()是否占用内存



在我的C程序中,根据用户的输入,将为给定的模拟分配内存。我最初面临的问题是,用户可以请求一个大的数字来分配,但malloc()永远不会失败,直到它耗尽内存,然后程序崩溃。

我研究了这背后的逻辑,现在对我来说是有意义的,参见[1][2]。这里给出的一个可能的解决方法是"c++中分配内存时的SIGKILL",建议将/proc/sys/vm/overcommit_memory中的overcommit_memory in从0设置为2。

这从一个侧面解决了问题。但由于我使用的是-fsanitize=address,我从消毒剂中得到错误。

有更好的解决方案吗?

我猜clang地址消毒剂失败是因为有一个合法的泄漏。所以我的回答忽略了:

选择:

  1. 禁用过度提交行为,因为你已经发现:这会影响其他进程,并且需要root权限。
  2. 在禁用oom杀手的docker镜像中运行应用程序:这不会影响其他进程,但需要root用户安装docker(这是我最喜欢的解决方案)。
  3. 在malloc之后写:可能需要很长时间来分配一大块内存,并且你的进程仍然可能因为其他正在运行的进程而被杀死,但不需要root。
  4. 使用ulimit -v来限制内存量,这取决于机器:这也不需要root,但你的进程可能会被杀死。

第三种选择的代码(linux):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <setjmp.h>
jmp_buf resume_malloc;
void handle_malloc_error(int sig)
{
   longjmp(resume_malloc, sig);
}
void *memalloc(size_t sz) {
   void *p = 0;
   int sig = setjmp(resume_malloc);
   if ( sig == 0 ) {
      p = malloc(sz);
      signal(SIGSEGV, &handle_malloc_error);
      memset(p, 0, sz);
   } else {
      p = 0;
   }
   signal(SIGSEGV, SIG_DFL);
   return p;
}
int main(int argc, char *argv[])
{
   size_t sz = 160L * 1024 * 1024 * 1024L;
   void *p;
   for (int i=0; i < 100; i++) {
      printf("size: %lun", sz);
      p = memalloc(sz);
      if ( p == 0 ) {
         printf("out of memoryn");
         break;
      }
      sz *= 2;
   }
}

相关内容

  • 没有找到相关文章

最新更新