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

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

当然这是社区维基,因为没有一个正确的答案。

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


分段错误是由于对内存访问不良造成的,只有当您的操作系统具有MMU时。 否则,你不会得到它,但只有奇怪的行为。

虚拟内存(您可以访问的整个内存= 2 ^ sizeof(pointer type) )被映射到名为页或段的单元中的物理内存(分页取代分段但仍然被使用)。

每个页面都有一些保护权限,如果您尝试从不具有读取权限的页面进行读取,则会出现段错误。 如果你尝试写入只读位置,你会得到一个SIGSEGV。

如果你有一个单位指针并使用它,它可能会发生,它会指向另一个好位置,所以你不会得到一个段错误。 如果在绑定之后读取小数组,则可能会损坏其他内存区域(如果它未超出页面边界)。

另外,由于页面很多,并非所有页面都真正映射。 如果你触摸一个非映射页面,你会得到一个段错误。 实际上,对非映射页面的任何访问都必须考虑写入时的拷贝,交换页面,延迟加载,内存映射文件和其他内容。 看到这篇关于页面错误处理的文章,特别是那里的第二张图表,也在下面发布(请阅读文章以获取更多解释)

页面错误处理

您主要关注用户空间和通向SIGSEGV的所有路径。 但内核空间也很有趣。


取消引用NULL指针。

#include <cstddef> //For NULL.
int* p1 = NULL; //p1 points to no memory address
*p1 = 3; //Segfault.

访问数组越界(可能):

int ia[10];
ia[10] = 4; // Someone forgot that arrays are 0-indexed! Possible Segfault.
链接地址: http://www.djcxy.com/p/43891.html

上一篇: What can cause segmentation faults in C++?

下一篇: Getting Segmentation Fault