什么会导致C++中的分段错误?

flu*_*els 41 c++ segmentation-fault

我注意到C++中的分段错误的常见原因列表没有问题,所以我想我会添加它.

自然它是社区维基,因为没有一个正确的答案.

我认为这对于学习C++的新程序员可能有用,如果你不同意,可以随意关闭它.

Mih*_*eac 39

仅当您的操作系统具有MMU(内存管理单元)时,才会因访问内存不良而导致分段错误.否则,你不会得到它,但只有奇怪的行为.

虚拟内存(您可以访问的整个内存= 2^(sizeof(pointer_type)*8)(即:) 2^num_bits_in_pointer_type)以命名页面或段为单位映射到物理内存(分页取代分段但仍然使用它们).

每个页面都有一些保护权限,如果您尝试从没有读取权限的页面读取,您将获得段错误.如果您尝试写入只读位置,您将获得SIGSEGV.

如果你有一个单一化的指针并使用它,它可能会发生它将指向另一个好的位置,所以你不会得到段错误.如果在绑定之后有一个小数组读取可能会破坏其他内存区域,如果它没有超过页面边界.

此外,由于页面很多,并非所有页面都被映射.如果您触摸非映射页面,则会出现段错误.实际上,对非映射页面的任何访问都必须考虑写入时的复制,交换页面,延迟加载,内存映射文件和其他内容.请参阅本文关于页面错误处理,特别是那里的第二个图表,也在下面发布(但阅读文章了解更多解释)

页面错误处理

您主要对用户空间和导致SIGSEGV的所有路径中发生的事情感兴趣.但内核空间也很有趣.


flu*_*els 5

取消引用NULL指针.

#include <cstddef> //For NULL.
int* p1 = NULL; //p1 points to no memory address
*p1 = 3; //Segfault.
Run Code Online (Sandbox Code Playgroud)

  • 您对NULL的定义在哪里? (2认同)
  • 在`<stddef.h>`和其他几个标题中.在实践中,它可能间接包含在大多数C++头文件中,但最好确定,并且包括`<stddef.h>`或`<cstddef>`. (2认同)

Seb*_*fel 5

许多方法来“段错误” C ++并不一定保证的情况发生,事实上,与大多数的例子都贴在这里的情况。如果您可以在不发生段错误的情况下执行这些操作,那只是运气好(或运气不好,取决于您如何看待它!)。

这实际上是 C++ 中将它与其他语言区分开来的东西之一;未定义的行为。而在 Java 或 C# 中,您可能会收到“InvalidOperationException”或类似的信息,这在执行这些操作时肯定会发生;在 C++ 中,标准只是说“未定义的行为”,这基本上是幸运的,你永远不希望这种情况发生。

  • 对于 C++ 和未定义的行为来说,这是如此。 (2认同)