C++;STL容器毫无例外是不可用的,对此我们能做些什么? 所谓C++的精神是“你用什么,你付什么”。然而,由于异常及其在STL中的广泛使用,这可能会使人非常虚弱

C++;STL容器毫无例外是不可用的,对此我们能做些什么? 所谓C++的精神是“你用什么,你付什么”。然而,由于异常及其在STL中的广泛使用,这可能会使人非常虚弱,c++,stl,kernel,intrusive-containers,C++,Stl,Kernel,Intrusive Containers,在任何人说“只需打开异常”之前,生活对我们必须生活的编程环境并不慷慨。我的内核是执行程序,在执行环境中没有足够的C++运行时来释放堆栈,等等。 当STL容器无法为其底层备份存储重新分配存储时,将引发分配失败异常。当环境中未启用异常时,程序将相当神秘地崩溃:我已经看到实现直接中止,或者假设分配工作正常,即使没有 我遇到的许多C ADT库通过返回错误代码或将错误作为输出参数预先处理这个问题 什么是处理这个问题的“最好”C++方式?< /P> 澄清 我不想使用标准库,我不能。我不是在问“我如何做那些做

在任何人说“只需打开异常”之前,生活对我们必须生活的编程环境并不慷慨。我的内核是执行程序,在执行环境中没有足够的C++运行时来释放堆栈,等等。 当STL容器无法为其底层备份存储重新分配存储时,将引发分配失败异常。当环境中未启用异常时,程序将相当神秘地崩溃:我已经看到实现直接中止,或者假设分配工作正常,即使没有

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

什么是处理这个问题的“最好”C++方式?< /P> 澄清
我不想使用标准库,我不能。我不是在问“我如何做那些做不到的事情”。我在问:“如果没有问题,容器库应该如何构建。”

这很简单:不要相信你应该使用标准库来完成所有事情

标准库是用于实现功能的默认位置。然而,这并不意味着它适用于所有情况。例如,内核编程。这是一个相当小的环境,在这里你需要直接和明确地控制大多数C++程序员不关心的事情。 < >信令失败的C++标准机制,特别是像容器内部内存分配之类的东西,是抛出异常。绝大多数应用程序都不会费心捕捉这种异常;在不太可能的情况下,他们失去了记忆,他们就死了。这对他们来说很好。在这些情况下,返回错误代码充其量是困难的(考虑重新分配
std::vector
。如果内部
std::string
s中的一个得到OOM会发生什么?谁得到错误代码?由于异常是由
std::string
s copy构造函数引发的,您甚至如何发出构造函数失败的信号?). 只有真正需要关心的人才会关心得足够多

您正在受限环境中工作,而标准库并不是设计用来处理该环境的。所以不要在那种环境中使用它


我的建议是追踪。它是专门为这类事情设计的。我链接到的Github repo有一些bug修复等等,但基本上还是一样的。这是一段不错的代码。它们的类似STL的容器提供了大部分接口,因此它们大部分可以作为直接替换。但它们提供了专门控制内存分配的特殊功能。而且他们不会扔东西(或者至少你可以关掉扔东西)。

看来问题其实是你的环境。堆栈展开并不十分复杂。我可以看到为什么你要对它施加一些限制——抛出10 MB对象是合法的C++——但是即使在内核模式下,也应该支持非虚调用的“代码< STD::BADYOLLC/<代码>”。
考虑到这一点,STL设计是完全合理的。该接口只需要最少的异常支持,并且可以根据环境定制实现。

或者至少编写自己的容器<代码>排序,
分区
转换
,等等。朋友们都很好。我已经更新了我的问题,以便更清楚地知道我实际上要解决的问题。@user1290696:这是一个完全不同的问题。现在这是一个不可回答的建议问题,因为每个人对如何做都有自己的想法,没有一个是对的或错的。@user1290696:这似乎是BSD许可证,而不是GPL。@user1290696:“此外,一个有多个答案的问题几乎与无法回答相反……”这不是它的工作原理,但真正的信息来自博客。主观问题并非如此,对设计的推测(如何最好地设计X)最终是主观的。您可以查看现有的实现,手动删除所有异常的使用,或者重写容器以使用成功/错误代码。解决STL不足的最佳策略是评估您实际需要哪些容器,并根据需要实现它们。这里的问题相同,我正在开发一个带有132kb闪存的STM32。所以没有办法打开异常,我需要一些替代品,比如std::vector,或者自己编写。