代码之家  ›  专栏  ›  技术社区  ›  Michael Dickens

使malloc()返回NULL而不是使程序崩溃?

  •  4
  • Michael Dickens  · 技术社区  · 15 年前

    我在C程序中使用 malloc . 我的程序有可能分配的内存超过系统所能容纳的空间,这时程序就会崩溃。就我而言,如果 NULL (好像很明显 supposed to ),这样我就可以捕捉到错误。相反,它会抛出一个错误,说“现在程序没有可用内存:调用malloc不安全”,并使程序崩溃。

    编辑:我知道程序本身正在崩溃,而不是因为我试图引用空指针。程序从不直接调用 马洛克 ,而是调用我编写的函数 马洛克 无效的 马洛克 返回 无效的

    编辑2:如果有用,下面是完整的错误输出:


    sharedlibrary全部应用加载规则
    警告:无法还原以前选定的帧。
    数据格式化程序暂时不可用,将在“继续”后重试。(正在调试的程序在从GDB调用的函数中发出信号。


    将放弃对包含函数(dlopen)的表达式的求值。)
    现在没有内存可供编程:调用malloc不安全

    5 回复  |  直到 15 年前
        1
  •  2
  •   msw    15 年前

    一旦通过缓冲区溢出、野生指针或其他bug在堆上乱涂乱画,malloc的行为就变得没有定义,它可能返回任何东西。

    Malloc只是一个用户空间库,里面没有任何魔力。如果我在应用程序的客户名称链接列表上乱涂乱画,那么当您稍后访问该列表时,就会出现奇怪的行为。Malloc的行为方式是相同的,但是由于Malloc的使用是通过代码分发的,所以因果关系是全球性的。

    所有的答案都围绕着这样一个事实:指针错误是C代码中最常见的缺陷源。你很幸运,你得到了一个SIGBUS,这是缺陷的证据,可以从哪里和什么时候的故障发生广泛分离。使用 valgrind 帮助你找到真正的缺陷所在。

        2
  •  1
  •   geoff marshall    15 年前

    它检查Malloc是否返回NULL?你可能对平等测试有问题。尝试类似“if(malloc(…))then…;else…;”的操作,而不是特定的检查。

        3
  •  1
  •   spencer nelson    15 年前

    根据 this apple page ,如果 MallocErrorAbort 在xcode中打开环境变量。要关闭此变量,请右键单击树视图中的可执行文件,选择“获取信息”,然后转到“参数”选项卡。

        4
  •  1
  •   Community Mohan Dere    9 年前

    奇怪。。。如果我从命令行编译它,下面的代码对我有用。提供的运行时 malloc 有吗 a lot of options as Spencer mentioned . 如果您使用的是XCode,我会寻找一个控制它的选项。

    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int
    main()
    {
        signed long long alloc_sz = (1 * 1024 * 1024 * 1024);
        while (alloc_sz > 0ull) {
            char *ptr = malloc(alloc_sz);
            if (ptr == NULL) {
                fprintf(stderr, "failed to allocate %llu bytes\n",
                        (unsigned long long)alloc_sz);
                break;
            } else {
                free(ptr);
                fprintf(stderr, "allocated %llu bytes\n",
                        (unsigned long long)alloc_sz);
            }
            alloc_sz *= 2ull;
        }
        return 0;
    }
    

    顺便说一句: 这是在一个房间里吗 调试 释放 建造?也许XCode是想帮你解决这个问题。

        5
  •  0
  •   robbie_c    12 年前

    malloc's 内部状态,导致它做奇怪的事情。

    valgrind . 如果您的代码具有足够的跨平台性,可以在Linux上运行(可能在VM中),我建议您这样做。

    如果此选项对您不可用,MacOSX有自己的内置调试工具。在一个较高的水平上,有一些工具。在低层, malloc https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/malloc.3.html 向下滚动到 ENVIRONMENT 部分。例如,你可以用

    MallocGuardEdges=1 ./myProg
    

    你也可以使用 libgmalloc 马洛克 https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/libgmalloc.3.html

    您可以这样运行程序:

    DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib ./myProg