[杂谈] Access volation 的前因后果

Access volation 直译过来是访问违例,说的直白点,就是不按规矩访问内存的内容,我们一般称为 AV 错误。那么,访问内存的内容需要啥规矩呢?

一、基本原则:不是你的,你不能动

1、不能跨进程访问另一个进程的内存区域

一个进程不能试图跨进程访问另一个进程的内存,就象你不能随便上邻居家拿人家的东西一样(那叫偷,不过程序员的事,怎么能叫偷呢,对不?)。所以,一旦你访问别家的内存,你就属于违规访问,所以,当你跨进程的发一个指针到另一个进程,然后试图访问时,操作系统会捕获到这种越界,然后告诉你:瞎跑啥,懂规矩不?给你个黄牌AV警告!

那么,如果非要访问怎么办?有许多的解决方案,比如共享内存,比如Socket,比如管道等等等等~~~~,这里就不多说那么多废话。

2、不能访问一个未分配或者已经释放的内存区域

内存未分配给你这个进程,它就不属于你的进程。就象是家里的东西,家主健在,那就是家主说了算,不是你想拿来干嘛就干嘛的(小心被老爸削掉一层皮)。但你向家主申请过了,给你了,那就随你怎么办了,这叫守规矩!不守规矩迟早会有人教你如何守规矩(又是AV错误)。

二、守规矩:是你的,你也不能乱动

是你的,并不代表你可以乱动(比如你媳妇),乱动也是要付出代价的。你的进程向操作系统申请的内存块,它是受保护的(你媳妇的权益也受法律保护),一般来说,内存块的权限分为三种:

  1. 允许读:你有看的权利,可以远观,比如街上的美女;
  2. 允许写:你也有动手的权利,不止看了;
  3. 允许执行:你可以让它干点啥事,不只是供着;

当我们不守规矩,不按我们申请的权利去访问内存块时,那么也会出现AV异常。一般我们申请的内存块是有读和写的权利的,但执行的权利需要单独处理。当然一般并不代表全部嘛,有些内存并不是你主动申请,那权利当然也不在你。

理论上,AV错误基本上就是这么点事了,所有我们遇到的 AV 错误,不出意外都是违反上面的原则引起来的:

1、尝试读写未分配的内存块(不是你的);

2、尝试跨进程访问内存块(不是你的)

3、尝试执行已经卸载的模块的代码(还不是你的);

4、尝试读写自己无权访问的代码(是你的,但你没权利);

5、其它我暂时没想到的情况;

 

分享到: