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