7

メソッドが NULL を返した場合にプログラムを停止するマクロに malloc/realloc の呼び出しをラップしたいと考えています。

次のマクロを安全に使用できますか?

#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 のブール演算子は常に1or0を整数として生成し、入力値を生成しません。

于 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 に答える