【问题标题】:Is there an equivalent of set_new_handler() for malloc() failures?对于 malloc() 失败,是否有等效于 set_new_handler() 的方法?
【发布时间】:2011-05-17 09:33:54
【问题描述】:

在 C++ 中,can 安排在new 失败时调用一个函数。有没有办法在malloc 失败时调用函数?假设 malloc 是从我不想更改的第三方库调用的。

我认为没有可移植的答案,所以我很乐意接受特定于平台的答案。我在某些平台上使用 Linux+uclibc,在其他平台上使用 Linux+glibc。我打算使用setrlimit 来限制malloc 可以返回的内存量。

【问题讨论】:

  • 我们假设您已关闭过度使用。对吗?
  • Conrad:我希望如此,但我并不拥有整个系统,我只是提供一个应用程序。系统设计人员向我承诺了一定数量的 RAM,作为​​回报,我必须保证保持在该限制范围内。 (这是一款没有交换的嵌入式设备,因此人们非常重视内存预算并确保一切都合适)。

标签: c++ c malloc glibc uclibc


【解决方案1】:

malloc 如果失败则返回 NULL。您应该处理它,以及 CRT 内存功能的其他故障(realloc 尤其容易出错)。

在一般情况下,我认为您必须将所有 CRT 内存使用情况包装在您自己设计的函数中,以便在错误时进行重定向。

在 Windows 上,您可以使用 Allocation Hook Functions 连接到 CRT,这可能是您想要的一种方式。这为您提供了一个挂钩,可以通过onalloconrealloconfree 的逻辑有效地处理 CRT 调用。

由于我是 Windows 用户,因此我不做任何保证,但看起来 malloc_hook on Linux 提供的功能与 Windows 挂钩所允许的相同。这些方法应该使您能够在不更改第三方库中的代码的情况下捕获所有 CRT 内存调用,假设它们在运行时都使用相同的 CRT - 总是一个好主意,但至少在 Windows 上不能保证......

【讨论】:

  • 是的,__malloc_hook() 是 Linux 上的正确函数(至少 glibc - 我不知道 uclibc)。
  • 来自最近的手册页:“在多线程程序中使用这些钩子函数是不安全的,现在它们已被弃用。程序员应该通过定义和导出函数来抢占对相关函数的调用,例如作为“malloc”和“free”。” kernel.org/doc/man-pages/online/pages/man3/malloc_hook.3.html
猜你喜欢
  • 2021-04-08
  • 2019-09-12
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2012-05-27
相关资源
最近更新 更多