2011-10-11 55 views

回答

3

无论你是否使用异常,标准容器将(如果他们使用它们的默认分配器)抛出std::bad_alloc如果内存分配失败。如果你没有理解这一点,那么你的程序将会终止 - 所以在这种情况下,如果没有捕获异常,就没有办法检查成功。

如果你真的想消除异常(这在我看来是一个坏主意,即使你不想使用标准库),那么你将有沟的标准集装箱,重写你想什么容器使用非标准分配模型,检查并传播任何失败。标准容器都假定分配将成功或抛出,所以它们不能用于不提供保证的分配器。

+0

很高兴知道这一切。非常感谢。 – gruszczy

+0

您不需要非标准的分配模型,因为标准描述了new'运算符的nothrow版本。不过,不能使用标准库。 –

+0

@MooingDuck:通过“非标准分配模型”,我只是指与标准容器库指定的分配器需求不同的东西,而不是语言标准之外的东西。 –

1

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

+0

但是你可以在'new'中指定'nothrow',对不对?为什么容器不使用它? – gruszczy

+0

@gruszczy:容器在发生错误时会做什么? –

+1

@gruszczy:标准容器不使用'new';他们使用符合标准分配器要求的某种类型。其中一个要求是'allocate'函数,它会返回一个有效的指针,或者抛出一个异常。 –

0

好,异常禁用不是C++标准的一部分,所以你就可以进入特定的编译器的行为。也就是说,至少在GCC中,默认的new运算符是新的,而不是在malloc()失败时抛出异常,如果使用-fno-exceptions编译,只需中止程序。

1

如果你不想异常被抛向四周,你应该写自己的分配和使用,在您的地图:typedef std::map<int, int, std::less<int>, MyAllocator> my_map;

你必须拿出处理了内存不足的情况下,虽然自己的内部逻辑和标准接口没有提供任何明显的界面。

作为一种混合解决方案,你可以写一个allocator,从静态内存池需要的内存和调用一些全球性故障处理程序时的完整。

相关问题