代码之家  ›  专栏  ›  技术社区  ›  Rom098

无例外地处理STL错误

  •  8
  • Rom098  · 技术社区  · 14 年前

    我有一个经常使用STL的项目。现在我正在将项目移植到一个不支持异常的特定平台上。我可以禁用异常,但是我仍然需要处理STL错误。

    是否有任何方法可以正确处理STL错误(禁用异常)?是否有任何第三方STL实现对其有帮助?

    2 回复  |  直到 14 年前
        1
  •  7
  •   Lance Diduck    14 年前

    使用现有的std库coontainer并禁用异常编译的问题是std容器接口本身假定启用了异常。使用异常,如果operator new无法获取内存,它将抛出;没有异常,operator new将返回0,而std容器无法处理。

    一种方法是只使用STL算法+向量。您可以使用这个复制其他容器所做的大约95%。问题是大多数STL实现都假定

    v.reserve(v.size()+1);
    assert(v.size()+1<=v.capacity());
    

    永远不会断言(因为如果没有内存,保留将抛出)。为了确保这个永远不会抛出,我使用了“固定容量”容器,即在编译时具有固定容量的容器。基本上,这些是我传入一个特殊分配器的向量。然后您可以在插入前检查容器的最大\大小()。然后避免使用at()之类的东西。为了更好地预测,请使用基本字符串而不是向量。这将强制您只存储pod类型,在复制或默认构造时不会抛出。另外,内存需求更容易计算。

    另一种方法是使用侵入式容器。这些不会抛出(也许是接口误用的外部),因为它们从一开始就不会获取内存。

        2
  •  5
  •   Peter G.    14 年前

    可能是旧版本的 stlport 可以配置为不使用异常。这显然是不标准的,但满足了你的要求。