gpt4 book ai didi

c - GLib 句柄内存不足

转载 作者:行者123 更新时间:2023-12-04 02:54:18 25 4
gpt4 key购买 nike

我有一个关于 GLib 的问题。我想在服务器上下文中使用 GLib,但我不知道内存是如何管理的: https://developer.gnome.org/glib/stable/glib-Memory-Allocation.html

If any call to allocate memory fails, the application is terminated. This also means that there is no need to check if the call succeeded.

如果我查看源代码,如果 g_malloc 失败,它将调用 g_error:

g_error()

define g_error(...)

A convenience function/macro to log an error message.Error messages are always fatal, resulting in a call to abort() to terminate the application.[...]

但就我而言,当我正在开发服务器应用程序时,我不希望应用程序退出,我更愿意像传统的 malloc 函数一样,GLib 函数返回 NULL 或其他指示发生错误的东西。

所以,我的问题是,有没有办法处理内存不足?是否不建议将 GLib 用于服务器用途的应用程序?

如果我查看 abort 的人,我可以看到我可以处理信号,但我会使内存不足错误的管理有点痛苦......

The abort() function causes abnormal program termination to occur, unlessthe signal SIGABRT is being caught and the signal handler does notreturn.

谢谢你的帮助!

最佳答案

从内存力不足中恢复是非常困难的。原因是它可以被认为是一种终结状态,在某种意义上,内存缺失会持续一段时间,然后才会消失。即使对内存不足使用react(如通知用户)也可能需要更多内存,例如,构建和发送消息。一个相关的问题是有些操作系统(至少是 linux)可能对分配内存过于乐观。当内核意识到内存丢失时,它可能会终止应用程序,即使您的代码正在处理故障也是如此。

因此,要么你对整个系统的掌握比一般人更严格,要么你将无法成功处理内存不足错误,而且在这种情况下,帮助程序库在做什么并不重要.

如果你真的想在仍然使用 glib 的同时控制内存分配,你有部分方法可以做到这一点。不要使用任何 glib 分配函数并使用其他库中的一些。 Glib 提供在必要时接收“自由函数”的函数。例如:

https://developer.gnome.org/glib/2.31/glib-Hash-Tables.html#g-hash-table-new-full

哈希表构造函数接受用于销毁键和值的函数。在您的情况下,数据将使用自定义分配函数进行分配,而哈希数据结构将使用 glib 函数进行分配。

或者,您可以使用 g_try_* 宏来分配内存,这样您仍然可以使用 glib 分配器,但它不会因错误而中止。同样,这只能部分解决问题。在内部,glib 将隐式调用可能会中止的函数,并且假定它永远不会返回错误。

关于一般性问题:服务器在内存不足时崩溃是否有意义?显而易见的答案是否定的,但我无法估计这个答案的理论性。我只能期望服务器系统的大小适合其运行,并拒绝任何可能超出其容量的输入,因为它无效,为此,它可能使用哪些库并不重要。

关于c - GLib 句柄内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974254/

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