【问题标题】:Structured Exceptions (SE) from standard library calls来自标准库调用的结构化异常 (SE)
【发布时间】:2011-02-19 20:43:00
【问题描述】:

我有调用 ::fgetpos 的代码,这会导致无法捕获的内核异常(我的 VS 2008 项目中有选项 /ehs)。但我不禁认为标准库例程应该从不抛出这类异常。

更新:我尝试调用 ::fgetpos(0, &foo),这显然是错误的,而且我确实收到了内核级异常。我很困惑。为什么 C++ 标准库不执行最基本的参数检查(检查空指针)并引发 std::invalid_argument?

是否有任何标准库例程执行此类基本检查,或者它们是否都会愉快地导致程序终止?

【问题讨论】:

  • 你传递给fgetpos的参数是什么?如果您提供无效参数,标准库函数可以(通常)做任何他们喜欢的事情。
  • 未定义的行为可以为所欲为。我怀疑当您调用它时,某些不变量不成立,因此您会遇到异常;不是他们的错,您使用了错误的功能。

标签: c++ exception crt seh structured-exception


【解决方案1】:

为什么 C++ 标准库不执行最基本的参数检查(检查空指针)

因为如果您需要支票,您可以自己做。 C++ 的哲学是你不需要为你不需要的东西付费。如果我是一个聪明的程序员并且永远不会向函数传递无效的参数,为什么我的程序的性能可能会受到不必要的检查?

这就是为什么std::vector 例如同时提供operator[]at() 的原因,后者执行边界检查而前者不执行。如果您需要支票,请添加。

【讨论】:

    猜你喜欢
    • 2017-03-10
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多