Should I check if malloc() was successful?

前端 未结 2 761
礼貌的吻别
礼貌的吻别 2020-11-29 08:49

Should one check after each malloc() if it was successful? Is it at all possible that a malloc() fails? What happens then?

At school we were told that we should chec

2条回答
  •  旧时难觅i
    2020-11-29 09:38

    This mainly only adds to the existing answer but I understand where you are coming from, if you do a lot of memory allocation your code ends up looking very ugly with all the error checks for malloc.

    Personally I often get around this using a small malloc wrapper which will never fail. Unless your software is a resilient, safety critical system you cannot meaningfully work around malloc failing anyway so I would suggest something like this:

    static inline void *MallocOrDie(size_t MemSize)
    {
        void *AllocMem = malloc(MemSize);
        /* Some implementations return null on a 0 length alloc,
         * we may as well allow this as it increases compatibility
         * with very few side effects */
        if(!AllocMem && MemSize)
        {
            printf("Could not allocate memory!");
            exit(-1);
        }
        return AllocMem;
    }
    

    Which will at least ensure you get an error message and clean crash, and avoids all the bulk of the error checking code.

    For a more generic solution for functions that can fail I also tend to implement a simple macrosuch as this:

    #define PrintDie(...) \
        do \
        { \
        fprintf(stderr, __VA_ARGS__); \
        abort(); \
        } while(0)
    

    Which then allows you to run a function as:

    if(-1 == foo()) PrintDie("Oh no");
    

    Which gives you a one liner, again avoiding the bulk while enabling proper checks.

提交回复
热议问题