我想在 C ++ 中使用map
,但我不使用例外。在函数中使用map<int, int> my_map
之后,我如何检查它是否设法在内部分配内存(我知道除了异常,任何无法分配内存的新内部都会抛出异常)?
答案 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进行编译,则只需中止该程序。