如果我不使用例外,如何检查是否可以创建地图?

时间:2011-10-11 15:17:26

标签: c++ map memory-management

我想在 C ++ 中使用map,但我不使用例外。在函数中使用map<int, int> my_map之后,我如何检查它是否设法在内部分配内存(我知道除了异常,任何无法分配内存的新内部都会抛出异常)?

4 个答案:

答案 0 :(得分:3)

无论您是否使用异常,标准容器(如果使用其默认分配器)将在内存分配失败时抛出std::bad_alloc。如果你没有抓住这个,那么你的程序将终止 - 所以在这种情况下没有捕获异常就无法检查是否成功。

如果你真的想根除异常(在我看来这是一个坏主意,即使你不想使用标准库),那么你将抛弃标准容器,重写你想要使用的任何容器非标准分配模型,检查并传播任何故障。标准容器都假定分配将成功或抛出,因此它们不能与不提供该保证的分配器一起使用。

答案 1 :(得分:1)

无论您是否使用异常,C ++库都会将它们用于分配错误。如果你真的想要避免它们,你需要了解分配器,或者至少你自己的全局运算符new,并在内存不可用时提出一些其他方案(在全局变量中调用函数?)。

答案 2 :(得分:1)

如果你不想抛出异常,你应该编写自己的分配器并在地图中使用它:typedef std::map<int, int, std::less<int>, MyAllocator> my_map;

但是,您必须提出自己的内部逻辑来处理内存不足的情况,并且标准接口不提供任何明显的界面。

作为一种混合解决方案,您可以编写一个从静态内存池中获取内存的分配器,并在该内存池满时调用一些全局故障处理程序。

答案 3 :(得分:0)

那么,异常禁用不是C ++标准的一部分,因此您将进入特定于编译器的行为。话虽如此,至少对于GCC,默认运算符new将会在malloc()失败时抛出异常,如果使用-fno-exceptions进行编译,则只需中止该程序。