2

私がmalloc()C99でのチェックバージョンを書き込もうとしているとしましょう-何も派手ではなく、単純なラッパーで、malloc()returnsNULLがエラーメッセージを出力しstderrて終了します。何かのようなもの

   void* checked_malloc(size_t size) {
        void* ptr = malloc(size);
        if (ptr == NULL) {
            fprintf(stderr, "Failed to allocate %zd bytes\n", size);
            exit(1);
        }
        return ptr;
   } 

これに伴う問題の1つは、fprintfです。これは、それ自体でメモリを割り当てようとする可能性があり、メモリが不足しているため、すでに正常に失敗します。

メモリ割り当てに失敗した後、エラーメッセージを確実にログに記録する方法はありますか?または、チェック済みの書き込みを行うためのより良いアプローチはありますmalloc()か?コンパイラにとらわれないソリューションが非常に好まれます。

4

1 に答える 1

1

正直なところ、あなたは偏執的すぎると思います。現在のソリューションは問題ないようです。fprintf()で失敗する理由はありませんENOMEM。(2)write()のファイル ディスクリプタを呼び出すだけです。stderrメモリを割り当てる理由はありません。

もちろん、次write()のように、常に direct でログを記録することもできます。

static const char oom[] = "Out of memory!\n";
write(2, oom, sizeof(oom));

しかし、繰り返しますが、それはおそらくやり過ぎです。

また、すべてのライブラリ呼び出しがメモリ割り当てに関して何をするかについて心配する必要はありません。チェックを使用してmalloc()も、コード内の他の場所で適切なエラー チェックを行う代わりにはなりません。

于 2013-03-02T02:23:52.960 に答える