内存不能存为READ的几个原因

一般出现这个现象有两个方面 , 一是硬件 , 即内存方面有问题 。二是软件 , 这就有多方面的问题了 。
1、微软IE缓冲溢出漏洞引起
2、内存或虚拟内存地址使用冲突造成程序的运行需要分配一定的内存地址给程序使用 , 当程序结束时释放留出空间让给新的程序使用 , win是多任务的系统有时前程序未结束 又有新的任务开始到底要多少内存或虚拟内存来保证我们同时运行的工作任务呢?也许win在这个问题上没弄好 , 所以有此错误常常发生 , 一般运行大型软件或多媒体后出现这种情况
3、劣质内存条也会出现这个问题一般来说 , 内存出现问题的可能性并不大 , 主要方面是:内存条坏了、内存质量有问题 , 还有就是2个不同牌子不同容量的内存混插 , 也比较容易出现不兼容的情况 , 同时还要注意散热问题 , 特别是超频后 。你可以使用MemTest这个软件来检测一下内存 , 它可以彻底的检测出内存的稳定度 。假如你是双内存 , 而且是不同品牌的内存条混插或者买了二手内存时 , 出现这个问题 , 这时 , 你就要检查是不是内存出问题了或者和其它硬件不兼容 。
4、微软WINDOWS系统的漏洞 , windows把内存地址0X00000000到0X0000ffff指定为分配null指针的地址范围,如果程序试图访问这一地址 , 则认为是错误 。c/c编写的程序通常不进行严格的错误检查 , 当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针 。但是代码不检查这种错误 , 认为地址分配已经成功 , 于是就访问0X00000000的地址 , 于是就发生内存违规访问 , 同时该进程被终止 。ASCII字符填充组成的pif文件时会出现以下情况:一个非法的pif文件(用ascii字符""x""填充)至少要369字节 , 系统才认为是一个合法的pif文件 , 才会以pif的图标[pifmgr.dll,0]显示 , 才会在属性里有程序、字体、内存、屏幕等内容 。而且仅仅当一个非pif文件的大小是369字节时察看属性的“程序页时 , 不会发生程序错误 , 哪怕是370字节也不行 。当对一个大于369字节的非法pif文件察看属性的“程序页时 , Explorer会出错 , 提示:""***""指令引用的""***""内存 。该内存不能为""read"" , 问题出在pif文件的16进制地址:0x00000181[0x87]0x00000182[0x01]和 0x00000231[0xC3]0x00000232[0x02]即使是一个合法pif文件 , 只要改动这四处的任意一处 , 也会引起程序错误 。而只要把0x00000181和0x00000182的值改为[0xFF][0xFF] , 那么其它地址任意更改都不会引起错误 。
5、可能没有完全正确安装apache服务 , 且启动了它的原故; 把服务中OracleOraHomeXXHTTPServer改成停止
6、应用程序没有检查内存分配失败程序需要一块内存用以保存数据时 , 就需要调用操作系统提供的“功能函数来申请 , 如果内存分配成功 , 函数就会将所新开辟的内存区地址返回给应用程序 , 应用程序就可以通过这个地址使用这块内存 。这就是“动态内存分配 , 内存地址也就是编程中的“指针 。内存不是永远都招之即来、用之不尽的 , 有时候内存分配也会失败 。当分配失败时系统函数会返回一个0值 , 这时返回值“0已不表示新启用的指针 , 而是系统向应用程序发出的一个通知 , 告知出现了错误 。作为应用程序 , 在每一次申请内存后都应该检查返回值是否为0 , 如果是 , 则意味着出现了故障 , 应该采取一些措施挽救 , 这就增强了程序的“健壮性 。若应用程序没有检查这个错误 , 它就会按照“思维惯性认为这个值是给它分配的可用指针 , 继续在之后的运行中使用这块内存 。真正的0地址内存区保存的是计算机系统中最重要的“中断描述符表 , 绝对不允许应用程序使用 。在没有保护机制的操作系统下(如DOS) , 写数据到这个地址会导致立即死机 , 而在健壮的操作系统中 , 如Windows等 , 这个操作会马上被系统的保护机制捕获 , 其结果就是由操作系统强行关闭出错的应用程序 , 以防止其错误扩大 。这时候 , 就会出现上述的“写内存错误 , 并指出被引用的内存地址为“0x00000000 。内存分配失败故障的原因很多 , 内存不够、系统函数的版本不匹配等都可能有影响 。因此 , 这种分配失败多见于操作系统使用很长时间后 , 安装了多种应用程序(包括无意中“安装的病毒程序) , 更改了大量的系统参数和系统文件之后 。

推荐阅读