c - 如果 malloc 失败了怎么办?

c - 如果 malloc 失败了怎么办?

这取决于您的软件是什么以及您的代码的哪一部分受到影响。

首先要知道,当没有可用页面时,malloc() 可能会失败,如果您的应用程序达到它的限制,那么任何循环都不会工作,但是如果您的系统内存不足,值得一试,但您必须避免任何无限循环。惊喜!如果操作系统临时响应无法分配更多RAM,这完全正常,您可以按自己的方式处理。

无论如何,这是一个很好的问题

类似的问题是没有捕获信号,并且当多线程或异步 TCP 服务器获得中止的客户端连接时,软件被 SIGPIPE 终止。这是正常的,但会导致您的程序结束,但它不应该。为了防止这种情况,您必须挂钩信号。

在现实世界的例子中(我自己的)。

当 malloc 失败并且只影响我的部分代码时

我曾经在新连接发送数据时使用 malloc() 或 new[],我将接收到的数据存储到缓冲区中,如果 malloc 或 realloc 失败,函数返回为 false 并释放缓冲区,连接因错误而断开(内衣)所以在这个如果软件继续运行但一个连接断开。我认为这是正确的方法。

当 malloc 必须导致软件中止时

我曾经使用 malloc() 为关键数据腾出空间,如数组、定义核心的结构,这通常在软件开始时作为 init 部分运行,如果 malloc() 失败,软件必须中止并退出错误代码,因为所有操作都依赖于必须填充数据的表。(内置文件系统)

当 malloc 能够重试时

我的数据记录器软件是行业领先的类型(高可用性),如果 malloc() 失败,我会触发 mutex_lock(),这会导致后端软件冻结并尝试重试 malloc 过程 X 秒。如果 malloc() 继续失败,软件开始在所有线程上调用析构函数并执行完全关闭,但此时尝试 malloc() 不成功的线程有两个选项,malloc() 成功并完成堆栈调用和退出最后一个线程或执行回滚并退出最后一个线程。

每当发生这种情况时,软件也不会退出,请尝试从头开始等等..

也许值得一提..

几年前我遇到了完全相同的困境,某些东西导致我的软件内存泄漏并吃掉了我所有的 RAM,但是为了保存当前状态,我不得不在许多 malloc() 之后将其写出来,解决方案是当这种情况发生时我关闭所有线程并调用析构函数并保存数据,但有趣的是当我关闭所有连接并释放套接字时,ssl_ctx,...内存消耗下降到 128KB,经过几天的愉快调试,我发现 SSL_CTX有内部存储和缓存。所以现在当没有在线连接时,我释放 SSL_CTX 并像魅力一样工作。

总结

所以你可以看到这是一门艺术,你可以用 malloc() 做你想做的事,任何事情都取决于你,没有书也没有标准,如果 malloc() 失败了你应该怎么做。如果有人告诉你你应该做什么,那只是他的意见而已。

我避免无限循环的首选方法

PSEUDO CODE:

var ts = TIME()

var max_seconds = 5

var success = true

WHILE (MALLOC() == FAIL) DO

IF TS + max_seconds < TIME() THEN

success = false

BREAK

END

SLEEP(100ms)

END

相关推荐

【干货】台球低杆技巧和低杆加塞的路线图解
mobile365-777

【干货】台球低杆技巧和低杆加塞的路线图解

📅 06-28 👁️ 3605
科鲁兹和捷达哪个车更好?
365Bet官方

科鲁兹和捷达哪个车更好?

📅 06-30 👁️ 7223
弓百弓什么字 弓百弓是啥字
365bet网上手机投注

弓百弓什么字 弓百弓是啥字

📅 07-03 👁️ 4382
动态SQL标签大全
mobile365-777

动态SQL标签大全

📅 07-05 👁️ 8846
眯萋的意思
365Bet官方

眯萋的意思

📅 06-28 👁️ 7386
曩昔的意思
mobile365-777

曩昔的意思

📅 07-04 👁️ 3209
excel表格怎么设置返回
mobile365-777

excel表格怎么设置返回

📅 07-08 👁️ 5624
依偎的意思
365bet网上手机投注

依偎的意思

📅 07-05 👁️ 8068