电脑是我们工作和娱乐不可或缺的工具。每个人都会生病,电脑也会生病,尤其是在我们“暴力”使用的情况下,电脑会以各种方式崩溃。今天S姐给大家带来了其中的一个,叫做“0X?该指令引用0x00000000存储器,该存储器不能被写入或读取。
当我们看到这句话,点击确定,打开的应用就会自动关闭。有人会说这是系统不稳定造成的,不用担心。真的是这样吗?其实不是这样的!
原因有二:一是应用程序检查内存分配失败,二是应用程序由于自身BUG引用了异常内存指针。
我们来一一解释一下。当一个程序需要一块内存来保存数据时,需要调用操作系统提供的“函数function”来申请。如果内存分配成功,函数会将新打开的内存区域的地址返回给应用程序,应用程序可以通过这个地址使用这个内存。这就是“动态内存分配”,内存地址也是编程中的“指针”。
因为内存不是取之不尽的,所以存在分配失败的可能。分配失败后,系统函数将返回值0。此时,返回值“0”不再指示新启用的指针,而是系统发送给应用程序的一个通知,表明发生了错误。作为应用程序,应该在每次内存应用后检查返回值是否为0。如果是,说明有故障,要采取一些措施来挽救,增强了程序的安全性。
如果应用程序不检查这个错误,它会认为这个值是根据“思维惯性”分配给它的可用指针,并在后续操作中继续使用这个内存。真正的0地址存储区存储的是计算机系统中最重要的“中断描述符表”,是绝对不允许应用程序使用的。
在没有保护机制的操作系统(比如DOS)中,向这个地址写数据会导致立即崩溃,而在有保护的操作系统中,这个操作会立即被系统的保护机制捕获,结果就是操作系统会强制关闭错误的应用程序,防止其错误扩大。此时会出现上述“写内存”错误,指出引用的内存地址为“0x00000000”。
在第二种情况下,在使用动态分配的应用程序中,有时程序试图读写一个“应该可用”的内存,但由于某种原因,这个预期的可用指针已经失败。可能是“忘记”向操作系统要求分配,也可能是程序本身在某个时候取消了这个内存,“没注意”。
注销的内存被系统回收,其访问权不再属于应用程序,所以读写操作也会触发系统的保护机制,于是操作终止,所有资源被回收。像这样的情况属于程序本身的BUG,你经常可以在一个特定的操作序列中重现错误。无效指针不总是0,所以错误提示中的内存地址不一定是“0x00000000”,也可以是其他随机数。
理解了触发条件之后,我们的解决方案就变得简单了。
解决方案:
1.首先,我们需要检查系统是否被木马或病毒感染。此类程序可能会修改系统以获得对系统的控制,从而导致操作系统异常。
2.更新或恢复操作系统,将操作系统恢复到正常版本,并修复系统文件和更正参数。当然,每个版本的操作系统也会有自己的bug,我们可以随时关注官方发布的升级方案。
3.使用正式版软件和系统,应用程序的测试版或使用版可能会存在不稳定性和bug。
4.重新注册系统中的所有DLL文件,[win] [r]打开运行菜单栏,输入[cmd],按[Enter]进入“c:\windows\system32\cmd.exe”窗口。在(%windir% \ system32 \ *中为% 1输入:dll)在“c:\windows\system32\cmd.exe”窗口的命令提示符下做regsvr32.exe/s% 1,最后点击[Enter]。
5.如果以上操作仍不能解决问题,重装系统频繁出现内存错误,则需要排除硬件问题,更换内存进行测试。
好辣~以上是解决内存无法读写问题的方法。如果你正苦于这个问题,请自己尝试一下~当然,操作前请务必备份好重要信息!本期到此为止~下期见~!