gpt4 book ai didi

c++ - 当在某些非 C++ 程序中使用 C++ 代码时,C++ 运行时调用 terminate() 是否为 "legal"?

转载 作者:可可西里 更新时间:2023-11-01 18:11:58 25 4
gpt4 key购买 nike

在某些情况下 - 特别是当异常在堆栈展开期间从析构函数中逃脱时 - C++ 运行时调用 terminate() ,它必须做一些合理的事后分析然后退出程序。当出现“为什么如此苛刻”的问题时,答案通常是“在这种错误情况下没有比这更合理的事情了”。如果整个程序都是用 C++ 编写的,这听起来很合理。

现在,如果 C++ 代码在一个库中,而使用该库的程序不在 C++ 中怎么办?这种情况经常发生——例如,我可能有一个由 .NET 程序使用的 native C++ COM 组件。一旦在组件代码中调用了 terminate(),.NET 程序就会突然异常结束。程序作者首先会想“我不关心 C++,为什么这个库让我的程序退出?”

在使用 C++ 开发库时如何处理后一种情况? terminate() 意外结束程序是否合理?有没有更好的方法来处理这种情况?

最佳答案

为什么 C++ 运行时调用 terminate()?它不会随机执行,也不会由于编写代码时无法定义和/或避免的情况而执行。之所以这样做,是因为您的代码执行了一些定义为调用 terminate() 的操作,例如在堆栈展开期间从析构函数中抛出异常。

在 C++ 标准中有一个列表,列出了所有定义为调用 terminate() 的情况。如果您不想调用 terminate(),请不要在您的代码中执行任何这些操作。这同样适用于 unexpected()abort() 等。

我认为这与您必须避免未定义的行为或通常避免编写错误的代码这一事实没有任何不同。您还必须避免已定义但不受欢迎的行为。

也许您有一个特定的示例,其中很难避免调用 terminate(),但在堆栈展开期间从析构函数中抛出异常不是吗。永远不要从析构函数中抛出异常。这意味着设计您的析构函数,以便在它们执行可能会失败的操作时,析构函数会捕获异常并且您的代码会继续处于定义的状态。

在某些情况下,您的系统会因为您的 C++ 代码所做的某些事情(尽管不是通过调用 terminate())而无礼地中断您的进程。例如,如果系统过度使用内存并且 VMM 无法兑现 malloc/new 做出的 promise ,那么您的进程可能会被终止。但这是一项系统功能,可能同样适用于调用 C++ 的其他语言。我不认为您可以(或需要)对此做任何事情,只要您的调用者知道您的库可能会分配内存。在那种情况下,进程死亡不是您的代码的错,而是操作系统对低内存条件的定义响应。

关于c++ - 当在某些非 C++ 程序中使用 C++ 代码时,C++ 运行时调用 terminate() 是否为 "legal"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507697/

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