gpt4 book ai didi

服务器应用程序中的 C 内存管理

转载 作者:太空狗 更新时间:2023-10-29 11:38:34 26 4
gpt4 key购买 nike

我是学生,我正在用 C 语言编写 HTTP 代理应用程序。我在内存管理方面遇到了麻烦。在我以前的所有应用程序中,我只是围绕 malloc 编写了一个包装器,当 malloc 失败时它会中止。

void *xmalloc(size_t size)
{
void *ptr;

assert(size);

ptr = malloc(size);
if (!ptr)
abort();

return ptr;
}

我现在发现这还不够,因为我只想在内存暂时不足导致内存分配失败时拒绝客户端并继续为其他客户端提供服务。如果我不想在每次 malloc 调用后用检查弄乱我的代码(我在解析代码中每个函数都有很多检查),还有什么其他选项可以处理内存管理,哪个最适合我的目的以及如何做服务器应用程序处理内存管理和内存不足的常用方法是什么?

从我当前的代码中考虑这个函数,它从 HTTP 消息的 header 部分解析一行(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 错误处理代码混在一起。我应该怎么办?谢谢。

P.S:我正在编写在 POSIX/类 Unix 系统上运行的应用程序。也可以随意批评我当前的编码风格和做法。

最佳答案

如果您想使用像 C 这样的相对较低级别的语言,那么您不必太担心在两个地方添加类似 if(tmp_value == NULL) goto out; 的内容。

如果您无法忍受 2 行琐碎的额外代码的想法,那么也许可以尝试一种正确支持异常的语言(例如 C++)并改为添加 throw/try/catch。 注意:我真的不喜欢 C++,但使用 C++ 必须比在 C 中实现您自己的“类异常”功能和整个自动资源取消分配层更有意义。

关于服务器应用程序中的 C 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com