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的所有路径中发生的事情感兴趣.但内核空间也很有趣.
取消引用NULL指针.
#include <cstddef> //For NULL.
int* p1 = NULL; //p1 points to no memory address
*p1 = 3; //Segfault.
Run Code Online (Sandbox Code Playgroud)
许多方法来“段错误” C ++并不一定保证的情况发生,事实上,与大多数的例子都贴在这里的情况。如果您可以在不发生段错误的情况下执行这些操作,那只是运气好(或运气不好,取决于您如何看待它!)。
这实际上是 C++ 中将它与其他语言区分开来的东西之一;未定义的行为。而在 Java 或 C# 中,您可能会收到“InvalidOperationException”或类似的信息,这在执行这些操作时肯定会发生;在 C++ 中,标准只是说“未定义的行为”,这基本上是幸运的,你永远不希望这种情况发生。