私は学生で、CでHTTPプロキシアプリケーションを作成しています。メモリ管理に問題があります。以前のすべてのアプリケーションでは、mallocが失敗したときに中止されるmallocのラッパーを作成しただけです。
void *xmalloc(size_t size)
{
void *ptr;
assert(size);
ptr = malloc(size);
if (!ptr)
abort();
return ptr;
}
これは、一時的なメモリ不足のためにメモリ割り当てが失敗したときに、クライアントを拒否して他のクライアントにサービスを提供し続けたいだけなので、今では不十分だと感じています。各malloc呼び出しの後にチェックでコードを乱雑にしたくない場合(コードの解析では関数ごとにかなり多くのオプションがあります)、メモリ管理を処理する他のオプションは何ですか?また、どのオプションが私の目的に最適で、どのようにサーバーアプリケーションがメモリ管理とメモリ不足を処理するための一般的な方法は何ですか?
HTTPメッセージのヘッダー部分から1行を解析する現在のコードからこの関数を検討してください(xstrndupはxmallocを呼び出します)。
int http_header_parse(http_hdr_table *t, const char *s)
{
const char *p;
const char *b;
char *tmp_name;
char *tmp_value;
int ret = -1;
assert(t);
assert(s);
p = b = s;
/* field name */
for (; ; p++) {
if (*p == ':') {
if (p-b <= 0) goto out;
tmp_name = xstrndup(b, p-b);
b = ++p;
break;
}
if (is_ctl_char(*p) || is_sep_char(*p)) goto out;
}
while (*p == ' ' || *p == '\t') {
p++; b++;
}
/* field value */
for (; ; p++) {
if (is_crlf(p)) {
if (p-b <= 0) goto err_value;
tmp_value = xstrndup(b, p-b);
p += 2;
break;
}
if (!*p) goto err_value;
}
http_hdr_table_set(t, tmp_name, tmp_value);
ret = 0;
xfree(tmp_value);
err_value:
xfree(tmp_name);
out:
return ret;
}
物事をシンプルに保ち、メモリ割り当てエラーを1か所で処理し、mallocエラー処理コードでコードを乱雑にしないようにしたいと思います。私は何をすべきか?ありがとうございました。
PS:私はPOSIX/Unixライクなシステムで実行するアプリケーションを書いています。また、私の現在のコーディングスタイルと慣習を自由に批判してください。