用Windows系统的朋友可能都碰到过这个报错:
「0X????????指令引用了0x00000000内存,该内存不能为read或written」,然后程序直接崩溃。
你要是去问所谓的高手,基本都会听到一句:Windows就这样,垃圾系统呗。
但其实这锅不一定全是Windows背的,下面咱就简单聊聊这种错误到底是怎么回事。
第一种情况:程序没做内存检查
程序运行时需要用到内存,这时候就会调系统函数来申请一块空间。
如果分配成功,系统会返回一个地址给程序,程序就能用这块内存了;
但如果失败了,系统就会返回0,表示没地方给你用了。
这个时候,程序应该知道自己申请失败了,得做一些处理,比如提示用户或者自己暂停一下。
但如果程序员疏忽了,没有写检查代码,那程序就会傻乎乎地继续往下跑,以为0这个地址是合法的。
而实际上,0地址那一块内存是系统核心数据,比如中断描述符表,是绝对不允许随便访问的。
在老系统(比如DOS)里乱动这个地方,电脑立马蓝屏死机;
而在现代系统像Windows里,会有保护机制,直接把出错程序咔嚓掉,防止影响整个系统。
于是你就看到了那个经典的内存读写错误,地址就是0x00000000。
造成这种情况的原因有很多,比如内存不够、系统版本不匹配、后台程序太多等等。
尤其是当你用了一段时间的电脑,装了很多软件,甚至不小心中了病毒之后,这类问题更容易出现。
第二种情况:程序自己有BUG,用了不该用的内存地址
有些时候,程序本来以为某个地址是可以读写的,但实际上已经出了问题。
比如内存已经被释放了,但程序还在试图访问;或者指针被错误赋值,指向了非法区域。
这时候也会触发类似的问题,报出不能读写的错误信息。
这种错误大多数时候还是程序自身的问题,而不是Windows系统太烂。
当然啦,谁还没写个bug?程序员也不是神嘛~
「0X????????指令引用了0x00000000内存,该内存不能为read或written」,然后程序直接崩溃。
你要是去问所谓的高手,基本都会听到一句:Windows就这样,垃圾系统呗。
但其实这锅不一定全是Windows背的,下面咱就简单聊聊这种错误到底是怎么回事。
第一种情况:程序没做内存检查
程序运行时需要用到内存,这时候就会调系统函数来申请一块空间。
如果分配成功,系统会返回一个地址给程序,程序就能用这块内存了;
但如果失败了,系统就会返回0,表示没地方给你用了。
这个时候,程序应该知道自己申请失败了,得做一些处理,比如提示用户或者自己暂停一下。
但如果程序员疏忽了,没有写检查代码,那程序就会傻乎乎地继续往下跑,以为0这个地址是合法的。
而实际上,0地址那一块内存是系统核心数据,比如中断描述符表,是绝对不允许随便访问的。
在老系统(比如DOS)里乱动这个地方,电脑立马蓝屏死机;
而在现代系统像Windows里,会有保护机制,直接把出错程序咔嚓掉,防止影响整个系统。
于是你就看到了那个经典的内存读写错误,地址就是0x00000000。
造成这种情况的原因有很多,比如内存不够、系统版本不匹配、后台程序太多等等。
尤其是当你用了一段时间的电脑,装了很多软件,甚至不小心中了病毒之后,这类问题更容易出现。
第二种情况:程序自己有BUG,用了不该用的内存地址
有些时候,程序本来以为某个地址是可以读写的,但实际上已经出了问题。
比如内存已经被释放了,但程序还在试图访问;或者指针被错误赋值,指向了非法区域。
这时候也会触发类似的问题,报出不能读写的错误信息。
这种错误大多数时候还是程序自身的问题,而不是Windows系统太烂。
当然啦,谁还没写个bug?程序员也不是神嘛~