我是学生,我正在用 C 编写 HTTP 代理应用程序。我在内存管理方面遇到了麻烦。在我之前的所有应用程序中,我只是简单地围绕 malloc 编写了一个包装器,当 malloc 失败时该包装器中止。
void *xmalloc(size_t size)
{
void *ptr;
assert(size);
ptr = malloc(size);
if (!ptr)
abort();
return ptr;
}
我现在发现这还不够,因为我只想在由于临时内存不足而导致内存分配失败时拒绝客户端并继续为其他客户端提供服务。如果我不想在每次 malloc 调用后用检查来弄乱我的代码(我在解析代码时每个函数都有很多检查),还有哪些其他选项可以处理内存管理,哪一个最适合我的目的,以及如何是服务器应用程序处理内存管理和内存不足的常用方法吗?
从我当前的代码中考虑这个函数,它从 HTTP 消息的标题部分解析一行(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;
}
我想保持简单并在一个地方处理内存分配错误,并且不要用 malloc 错误处理代码混淆代码。我应该怎么办?谢谢你。
PS:我正在编写在类 POSIX/Unix 系统上运行的应用程序。也可以随意批评我当前的编码风格和实践。