gpt4 book ai didi

C++ STL Containers 无一异常(exception)都无法使用,我们能做些什么呢?

转载 作者:IT老高 更新时间:2023-10-28 22:26:52 24 4
gpt4 key购买 nike

假定的 C++ 精神是“所用,付费”。但是,由于异常及其在 STL 中的广泛使用,这可能会让人非常沮丧。

在任何人说“打开异常”之前,我们必须生活的编程环境并不那么慷慨。我是内核编程,其中执行环境不提供足够的 C++ 运行时来展开堆栈等。

当 STL 容器无法为其底层后备存储重新分配存储空间时,它们将引发分配失败异常。当环境中未启用异常时,程序将相当神秘地崩溃:我已经看到实现直接中止,或者只是假设分配有效,即使它没有。

我遇到的许多 C ADT 库通过返回错误代码或将错误作为输出参数来预先处理此问题。

处理这个问题的“最佳”C++ 方法是什么?

澄清

我不想使用标准库,我不能。我不是在问“我怎么做不能做的事”。我在问:“给定一张白纸,如何构建容器库。”

最佳答案

这很简单:不要再相信你应该为一切使用标准库。

标准库旨在成为您使用功能的默认位置。但是,这并不意味着它适用于所有情况。比如内核编程,例如。这是一个相当小众的环境,您需要直接和明确地控制大多数 C++ 程序员不关心的事情。

发出失败信号的 C++ 标准机制,尤其是诸如从容器分配内部内存的情况,是抛出异常。绝大多数应用程序都不会费心去捕捉那个异常;万一他们内存不足,他们就会死去。这对他们来说很好。在这些情况下返回错误代码充其量是困难的(考虑重新分配 std::vector<std::string> 。如果内部 std::string s 之一是导致 OOM 的原因会发生什么?谁得到错误代码?你甚至会如何发出失败信号的构造函数,因为异常是由 std::string 的复制构造函数抛出的?)。只有真正需要关心的人才会足够关心才能捕获它。

您在受限环境中工作,这是标准库无法处理的环境。所以...不要在那种环境中使用它。

我的建议是追踪 a copy of EASTL .它真的是为这种事情而设计的。我链接到的 Github 存储库有一些错误修复等,但它仍然基本相同。这不是一个糟糕的代码。它们的类 STL 容器提供了大部分接口(interface),因此它们大多可以直接替代。但是它们提供了特殊的功能来专门控制内存分配。而且他们不 throw (或者至少,你可以关闭 throw )。

关于C++ STL Containers 无一异常(exception)都无法使用,我们能做些什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com