我正在从C转向C++11,并试图找出C++11程序(或任何具有内置异常的现代语言)的内存管理范例。特别是,我正在尝试进行游戏开发,在其中内存耗尽是一个真正的问题。
在C中,我使用检查malloc的返回值;并通常使用自定义分配器。
对于C ++,我感到相当困惑;尽管我喜欢STL容器的构建方式,允许自定义分配器。由于STL容器都管理自己的内存,因此仅向向量添加元素就可能引发std :: bad_alloc。我该如何防范这种情况?我听说将所有抛出调用包装在try / catch块中可能会导致成本过高。
然而,允许异常传播到调用堆栈中将允许一堆函数无法完全执行,并且将导致一些非常棘手的代码。即如果A->B->C->D是调用堆栈,则D抛出异常,A捕获,则B、C和D可能通过无法正常完成执行而创建一些奇怪的问题。
此外,
有哪些最佳实践可以编写异常安全的C++代码以保护免受内存不足问题的影响? 编辑:在progammers.stackexchange上提供了一个相关答案,主张在控制台中设计无异常的C++。不确定这些论点是否仍适用于第8代游戏机。
在C中,我使用检查malloc的返回值;并通常使用自定义分配器。
对于C ++,我感到相当困惑;尽管我喜欢STL容器的构建方式,允许自定义分配器。由于STL容器都管理自己的内存,因此仅向向量添加元素就可能引发std :: bad_alloc。我该如何防范这种情况?我听说将所有抛出调用包装在try / catch块中可能会导致成本过高。
然而,允许异常传播到调用堆栈中将允许一堆函数无法完全执行,并且将导致一些非常棘手的代码。即如果A->B->C->D是调用堆栈,则D抛出异常,A捕获,则B、C和D可能通过无法正常完成执行而创建一些奇怪的问题。
此外,
nothrow
参数似乎允许非常类似C的代码;但我现在看不出与普通malloc相比的好处。有哪些最佳实践可以编写异常安全的C++代码以保护免受内存不足问题的影响? 编辑:在progammers.stackexchange上提供了一个相关答案,主张在控制台中设计无异常的C++。不确定这些论点是否仍适用于第8代游戏机。
malloc()
返回一个非空指针,但一旦你实际使用该内存,它仍然会失败(因为虚拟内存处理程序只有在然后意识到它已经用完了交换空间)? - DevSolar