是否存在与NullPointerException相当的C++

Jan*_*sen 20 c++ nullpointerexception

Java和C#以及可能还有许多其他语言都有一个预定义的异常类,当使用null参数时它会抛出它.C++中有类似的东西吗?如果没有,是否有我可以使用的另一个预定义的异常,或者我应该定义自己的异常?

Luc*_*ore 21

取消引用NULL指针是C++中未定义的行为 - 这意味着代码似乎可以正常工作.不保证会抛出异常.你可以使用

std::invalid_argument

异常(为它提供有意义的值 - "p is NULL"),但您必须自己进行检查.


ere*_*eOn 9

通常,在C++(或C语言)中,您永远不会取消引用NULL指针.这样做有未定义的行为(可能是我所知道的任何实现的段错误,但任何事情都可能根据标准发生).在其他语言中它也可能是一件坏事,但我不知道那些足以断言.

最好是防止这种情况,而不是尝试从中恢复(无论如何都无法在C或C++中完成).

防止一些相关程序员错误的常用模式是使用assert()内部函数体,例如:

int foo(int* myint)
{
  // Ensure myint is not NULL
  assert(myint);

  // Do something with myint
  (*myint)++;

  return *myint;
}
Run Code Online (Sandbox Code Playgroud)

这些assert()调用在发布版本中完全被忽略,因此在生产中没有成本.他们只是帮助发展.在调试版本上,如果不满足条件,程序会立即中止并显示非常明确的错误消息.通过调试器运行它,您可以轻松检查调用堆栈以查询确切原因.

  • 通常在C#en Java中依赖捕获空指针也是不好的做法(只有异常是从所有运行时异常中恢复得非常高,例如在线程池中).它们旨在使查找编程错误变得更容易. (5认同)

bri*_*ing 6

C++中没有用于解除引用NULL指针的标准异常.

如果你想要它,你可以自己实现它.在UNIX上设置SIGSEGV信号处理程序并从处理程序中抛出异常.在Windows上,使用_set_se_translator()API安装"结构化异常"处理程序.