7

我想将对 malloc/realloc 的调用包装到一个宏中,如果该方法返回 NULL,该宏将停止程序

我可以安全地使用以下宏吗?

#define SAFEMALLOC(SIZEOF) (malloc(SIZEOF) || (void*)(fprintf(stderr,"[%s:%d]Out of memory(%d bytes)\n",__FILE__,__LINE__,SIZEOF),exit(EXIT_FAILURE),0))
char* p=(char*)SAFEMALLOC(10);

它可以编译,可以在这里使用SAFEMALLOC(1UL)SAFEMALLOC(-1UL)但这是一种安全的方法吗?

4

3 回答 3

13
static void* safe_malloc(size_t n, unsigned long line)
{
    void* p = malloc(n);
    if (!p)
    {
        fprintf(stderr, "[%s:%ul]Out of memory(%ul bytes)\n",
                __FILE__, line, (unsigned long)n);
        exit(EXIT_FAILURE);
    }
    return p;
}
#define SAFEMALLOC(n) safe_malloc(n, __LINE__)
于 2013-04-30T11:35:56.200 回答
6

不,它坏了。

似乎假设布尔值或运算符||返回其参数,如果它被认为是真的,那不是它的工作原理。

C 的布尔运算符总是生成10作为整数,它们生成任何输入值。

于 2013-04-30T10:16:16.887 回答
5

使用你的宏:

#define SAFEMALLOC(SIZEOF) (malloc(SIZEOF) || (void*)(fprintf(stderr,"[%s:%d]Out of memory(%d bytes)\n",__FILE__,__LINE__,SIZEOF),exit(EXIT_FAILURE),0))

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char *p = SAFEMALLOC(10);
    char *q = SAFEMALLOC(2000);

    printf("p = %p, q = %p\n", p, q);

    // Leak!
    return 0;
}

警告(应该是一个线索):

weird.c:8: warning: cast to pointer from integer of different size
weird.c:8: warning: initialization makes pointer from integer without a cast
weird.c:9: warning: cast to pointer from integer of different size
weird.c:9: warning: initialization makes pointer from integer without a cast

输出:

p = 0x1, q = 0x1

总之,不,这不是很安全!编写一个函数可能不太容易出错。

于 2013-04-30T10:07:44.247 回答