-2

我在 Google 上进行了快速搜索,但找不到与该确切主题相关的任何内容。

随着 C++ 继续朝着成为一种更现代的语言发展,包括 lambda、基于范围的 for 循环等,似乎这个问题最终可能会出现,如果它还没有出现的话。

我看不出这怎么可能是一件好事,并提供在 C++/CLI、C#、Java 等中被证明有用的相同好处。如果有人不想要这种行为,它可能只是设为可选,并通过编译器设置关闭,就像禁用标准异常或 RTTI 一样。

此外,有人建议,但不鼓励为 SIGSEGV 创建信号处理程序并从那里抛出异常,以模拟建议的行为。现在,虽然这有点小技巧,并且不能保证在所有平台上都有效,但是如果可以用大约 10 行来模拟(非标准)相同的基本行为,那么在 C++ 中实现空引用异常到底有多难代码?

那么,是否有任何技术或其他原因导致错误的指针访问引发异常最终无法成为未来标准的一部分?

4

3 回答 3

5

编辑:要正确回答这个问题,需要能够准确地预见未来。这在短时间内很容易,但时间越长,它就越不确定。我在这里的回复应该被视为在不久的将来可以预见的尝试。这是否会在 20 到 30 年内发生,谁能说得清?

一方面,从技术角度:

问题是 NULL 引用只是坏指针的一种可能情况。如果将一些随机垃圾放入指针变量中,或者在空闲后访问内存,或者其他导致错误内存访问的东西也会导致 SIGSEGV。这是第一个问题。

第二个问题是并非所有硬件和/或软件组合都允许检测错误的指针访问 - 或者在错误的指针访问之后继续的方法。

简单地if (ptr != NULL) ...在每个指针取消引用之前添加 [编译器不确定它是否是有效指针] 将使 C++ 慢得难以忍受。

从哲学的角度来看,使用 RAII:您不应该在代码中使用“原始”指针,如果系统内存不足,new则会导致异常。std::bad_alloc在 RAII 风格的 C++ 中,指针确实没有理由无效。如果您不使用 RAII,那么您可能应该使用。

C++ 被设计成一种首先是快速,其次是复杂的语言。

于 2013-08-18T23:39:47.563 回答
0

为错误的指针访问引发异常是否会成为 C++ 中的标准行为?

您可以检测错误的指针访问,并且该语言允许您相应地引发异常。

正如您所说,C++ 包括 lambdas、基于范围的 for 循环等。它为您提供了丰富的可能性,但永远不会妨碍您并强迫您做某事。所以我认为该标准不会强迫这种行为,也不应该。

于 2013-08-19T00:25:45.063 回答
0

没有永不。异常的基本规则是它们throw语句抛出。这使得封装可能在try块内引发异常的代码成为可能。如果几乎任何语句都可能引发异常,那么对异常安全性的推理将变得更加困难。

如果您的指针失控,请修复它们。

于 2013-08-19T13:14:35.670 回答