我有一个使用STL的项目。现在我正在努力将项目移植到不支持异常的特定平台。我可以禁用异常,但是我仍然需要处理STL错误。
是否有任何方法可以在禁用异常的情况下正确处理STL错误?是否有任何第三方STL实施有助于它?
答案 0 :(得分:7)
使用现有的std库coontainer并禁用异常进行编译的问题是std容器接口本身假设启用了异常。使用异常,如果new无法获取内存,则new将抛出,而没有异常,operator new返回0,而std容器无法处理。
一种方法是仅使用STL算法+向量。您可以使用此复制大约95%的其他容器执行的操作。问题是大多数STL实现都假设
v.reserve(v.size()+1);
assert(v.size()+1<=v.capacity());
永远不会断言(因为如果没有内存,则会抛出保留)。为了确保永不抛出,我使用了“固定容量”容器,即在编译时具有固定容量的容器。基本上这些是我传递一个特殊分配器的向量。然后你可以在插入之前检查容器的max_size()。然后避免使用at()之类的东西。为了更好的预测,使用basic_string而不是vector。这会强制您仅存储POD类型,这些类型在复制或默认构造时不会抛出。内存需求更容易计算。
另一种方法是使用侵入式容器。这些不会抛出(可能在滥用界面之外),因为它们从不首先获取内存。
答案 1 :(得分:5)
可能会将stlport的旧版本配置为不使用例外。这显然是非标准的,但满足您的要求。