【发布时间】:2014-10-01 03:50:08
【问题描述】:
我正在从 C 迁移到 C++11,并试图找出 C++11 程序(或任何具有内置异常的现代语言)的内存管理范例。具体来说,我在游戏开发方面遇到了难题,其中内存耗尽是一个真正的问题。
在 C 中,我习惯于检查 malloc 的返回值;并且通常使用自定义分配器。
对于 C++,我很困惑;虽然我喜欢 STL 容器是如何构建允许自定义分配器的。由于 STL 容器都管理自己的内存,因此简单地向向量添加元素可能会抛出 std::bad_alloc。我该如何防范这样的事情?我听说将所有 throwing 调用包装在 try/catch 块中可能会非常昂贵。
但是,允许异常在调用堆栈中向上传播会导致一堆无法完全执行的函数,并会导致一些非常棘手的代码。即如果A->B->C->D 是一个调用堆栈,D 抛出,A 捕获,那么B、C 和D 可能会因为无法正常完成执行而产生一些奇怪的问题。
此外,nothrow 参数似乎允许非常类似 C 的代码;虽然我现在看不到普通 malloc 的好处。
编写异常安全的 C++ 代码以防止内存不足问题有哪些最佳实践?
编辑:A relevant answer on progammers.stackexchange arguing for exception-less C++ design in consoles.不确定这些论点是否仍然适用于8th generation consoles
【问题讨论】:
-
您知道某些平台会很高兴地从
malloc()返回一个非空指针,并且一旦您实际使用该内存仍然会失败(因为虚拟内存处理程序仅然后意识到它的交换空间不足)? -
@DevSolar 是的,有人告诉我这是一种可能性。幸运的是我从来没有遇到过这个问题——不知道在这种情况下我会做什么,除了保持足够大的缓冲区在这种情况下解除分配以便能够有一些回旋空间来适当退出
标签: c++ c++11 memory-management stl