运行某些程序的时候,有时候会弹出内存错误的提示,然后程序直接崩溃。
0x????????指令引用了0x????????内存,这个内存不能被读。
0x????????指令引用了0x????????内存,这个内存不能被写。
这种问题相信大家都遇到过吧,有些人甚至因为老是出现这种提示,直接选择重装系统。像我这种普通用户,根本看不懂那些一串串带字母的十六进制代码是啥意思。
造成这种情况的原因有两个方面:一个是硬件问题,比如内存条有问题;另一个就是软件层面的问题,那就比较复杂了。
先说硬件方面:
一般来说,电脑的硬件不容易坏,尤其是内存,除非你用的是那种特别便宜的杂牌货,不然一般不会出问题。常见的原因有这么几种:
1. 内存条本身坏了(特别是二手的容易出这问题)
2. 用了质量不好的内存条
3. 内存金手指那部分积灰太多,接触不良
4. 混用不同品牌或容量的内存,导致不兼容
5. 超频了但散热不行,导致内存不稳定
如果你怀疑是硬件问题,可以用一个叫MemTest的软件来检测内存的稳定性,这个工具挺靠谱的,能查出不少问题。
要是硬件没问题,那就得从软件方面找原因了。
简单说下原理:程序在运行时需要把数据放在内存的一个地方,叫做缓冲区。程序要使用这块内存的话,必须通过操作系统提供的函数去申请。如果申请成功,系统就会返回这块内存的地址给程序,程序就能用它了。这就是所谓的动态内存分配,那个地址就相当于编程里的指针。
不过内存也不是无限的,有时候申请也会失败。这时候系统会返回一个0值,表示出错了。正常来说,程序应该每次都检查返回值是不是0,如果是的话就要做相应的处理,避免出错。这样程序才会更稳定、更健壮。
但如果程序压根没做这个检查,它就会默认这个地址是有效的,继续往下执行,结果就会访问到不该碰的内存区域。比如说真正的0地址,里面存的是系统关键的中断描述符表,这是绝对不能乱写的。在没有保护机制的老系统(比如DOS)里,这么干直接死机;在Windows这类现代系统中,会被系统及时拦截,然后报错关闭程序。
出现这类问题可能硬件也可能是软件,建议先排查内存条的问题,再考虑是不是驱动、系统文件损坏或者程序本身的bug。
0x????????指令引用了0x????????内存,这个内存不能被读。
0x????????指令引用了0x????????内存,这个内存不能被写。
这种问题相信大家都遇到过吧,有些人甚至因为老是出现这种提示,直接选择重装系统。像我这种普通用户,根本看不懂那些一串串带字母的十六进制代码是啥意思。
造成这种情况的原因有两个方面:一个是硬件问题,比如内存条有问题;另一个就是软件层面的问题,那就比较复杂了。
先说硬件方面:
一般来说,电脑的硬件不容易坏,尤其是内存,除非你用的是那种特别便宜的杂牌货,不然一般不会出问题。常见的原因有这么几种:
1. 内存条本身坏了(特别是二手的容易出这问题)
2. 用了质量不好的内存条
3. 内存金手指那部分积灰太多,接触不良
4. 混用不同品牌或容量的内存,导致不兼容
5. 超频了但散热不行,导致内存不稳定
如果你怀疑是硬件问题,可以用一个叫MemTest的软件来检测内存的稳定性,这个工具挺靠谱的,能查出不少问题。
要是硬件没问题,那就得从软件方面找原因了。
简单说下原理:程序在运行时需要把数据放在内存的一个地方,叫做缓冲区。程序要使用这块内存的话,必须通过操作系统提供的函数去申请。如果申请成功,系统就会返回这块内存的地址给程序,程序就能用它了。这就是所谓的动态内存分配,那个地址就相当于编程里的指针。
不过内存也不是无限的,有时候申请也会失败。这时候系统会返回一个0值,表示出错了。正常来说,程序应该每次都检查返回值是不是0,如果是的话就要做相应的处理,避免出错。这样程序才会更稳定、更健壮。
但如果程序压根没做这个检查,它就会默认这个地址是有效的,继续往下执行,结果就会访问到不该碰的内存区域。比如说真正的0地址,里面存的是系统关键的中断描述符表,这是绝对不能乱写的。在没有保护机制的老系统(比如DOS)里,这么干直接死机;在Windows这类现代系统中,会被系统及时拦截,然后报错关闭程序。
出现这类问题可能硬件也可能是软件,建议先排查内存条的问题,再考虑是不是驱动、系统文件损坏或者程序本身的bug。