OS处理内存访问违规与处理内存写入违规

时间:2012-07-15 07:22:13

标签: c++ linux-kernel access-violation

是否有可能,在什么条件下,Linux内核会因内存写入违规而终止执行程序,但不会因同一内存位置的内存访问冲突而停止执行。

例如

//x is a pointer to a vector of structs
if( (*x)[i].member )
     break;                   //doesn't crash

if( (*x)[i].member )
    (*x)[i].member = 1;      //crashes, even though member is not used 
                             //elsewhere in the program 

2 个答案:

答案 0 :(得分:2)

如果存储元素的页面受到写保护,则会发生这种情况。 允许读取,但不写入(如果尝试,则进程被杀死)。

如果您尝试修改存储在只读部分中的字符串,则会发生C和C ++。

#include <stdio.h>
int main(void)
{
  char *foo = "hello";
  printf("%s\n", foo); // ok
  foo[0] = 'H';        // usually a crash
}

答案 1 :(得分:1)

如果您的数组位于只读内存中(例如,定义为const或您将其底层内存类型更改为只读),那么在尝试更改阵列时可能会崩溃。