【发布时间】:2011-04-05 13:10:57
【问题描述】:
我正在编写一个消耗大量内存的缓存应用程序。
希望我能很好地管理我的记忆,但我只是在想什么 如果我的内存用完了怎么办。
如果调用分配即使是一个简单的对象也失败了,是否有可能即使是 syslog 调用 也会失败?
编辑:好吧,也许我应该澄清这个问题。如果 malloc 或 new 返回一个 NULL 或 0L 值,那么它本质上意味着调用失败并且由于某种原因它不能给你内存。那么,在这种情况下,明智的做法是什么?
EDIT2:我刚刚意识到对“new”的调用可能会引发异常。这可能会在更高的水平上被抓住,所以我也许可以优雅地退出更远的地方。到那时,甚至可以根据释放的内存量来恢复。至少到那时我应该希望能够记录一些东西。因此,虽然我看到了在 new 之后检查指针值的代码,但这是不必要的。在 C 语言中,您应该检查 malloc 的返回值。
【问题讨论】:
-
这是一个有趣的问题。这让我想知道是否有与 Java 的软引用 (en.wikipedia.org/wiki/Soft_reference) 等效的 C++。
-
@Daniel:这与任何类型的引用系统有什么关系? C 和 C++ 中的内存释放完全是确定性的。
-
@Billy:是的。您可以捕获
std::bad_alloc并在特定分配失败的情况下执行某些操作。然而,因为这是一个缓存应用程序,所以能够找到最旧或最近访问最少的内存块可能会很好,这些内存块可以被释放以便为新分配腾出空间,而不是忽略缓存一条信息的新请求. Matt 可能正在寻找实现软引用的内存管理子系统。