内存故障问题

2024-09-20

内存故障问题(共7篇)

1.内存故障问题 篇一

一、内存损坏,导致开机内存报警

这种故障大家经常遇到,多数是头天晚上还好好的,第二天早晨一开机,听到的不是平时“嘀”的一声,而是“嘀,嘀,嘀...”响个不停,显示器也没有图像显示,这种故障多数时候是因为电脑的使用环境不好,湿度过大,在长时间使用过程中,内存的金手指表面氧化,造成内存金手指与内存插槽的接触电阻增大,阻碍电流通过,因而内存自检错误。表现为一开机就“嘀嘀”的响个不停,也就是我们通常所说的“内存报警”。

处理方法也很简单,就是取下内存,使用橡皮将内存两面的金手指仔细的擦洗干净,再插回内存插槽就可以了。

注意:在擦洗金手指时,一定不要用手直接接触金手指,因为手上汗液会附着在金手指上,在使用一段时间后会再次造成金手指氧化,重复出现同样的故障。

不过,此类内存报警还有其他几种原因:

1.内存与主板兼容性不好

把内存插在其他主板上,长时间运行稳定可靠;把其他内存插在故障主板上也运行可靠稳定,没有报警出现。但是把二者放在一起,就出现“嘀嘀”的报警声。此类故障只能更换内存来解决。

2.主板的内存插槽质量低劣

表现为更换多个品牌内存都出现“嘀嘀”的报警声,偶尔有某一个内存不报警,但可能关机重启后又会报警。此类故障的主要出现在二三百元的低档的主板上,原因是主板的价格低,使用的内存插槽质量也差,只能更换主板解决。

3.内存某芯片故障

此类故障相对比较严重,在开机自检时主机能够发现内存存在错误缺陷,不能够通过自检,发出“嘀嘀”的报警声,提示用户检查内存。这种故障要把内存插在其他主机上,检查是否有同样的“嘀嘀”声。如果有,就可以断定是内存有问题;如果没有,就可能属于上述第1个或每2个原因。

4.其他故障造成的内存报警

这类故障不常见,有可能是主板故障或CPU故障,造成内存报警,只能用排除法逐一替换解决。

二、内存损坏导致系统经常报注册表错误

这类故障比较常见,表现为能够正常启动系统,但是在进入桌面时,系统会提示注册表读取错误,需要重新启动电脑修复该错误,但是再次启动电脑后,仍旧是同样的故障。对于此类问题,我们可以进入安全模式,在运行中敲入“MSCONFIG”命令,将“启动”项中的ScanRegistry前面的“V”去除,然后再重新启动电脑。如果故障排除,说明该问题真的是由注册表错误引起的;如果故障仍然存在,基本上就可以断定该机器内存有问题,这时需要使用替换法,换上性能良好的内存条检验是否存在同样的故障。

有时候,长时间不进行磁盘碎片整理,没有进行错误检查时,也会造成系统错误而提示注册表错误,但对于此类问题在禁止运行“ScanRegistry”后,系统就可以正常运行,但速度会明显的变慢。对于此类问题,解决的最好方法就是先备份重要资料,然后重新安装WIN98。

三、内存损坏导致安装系统时提示“解压缩文件时出错,无法正确解开某一文件”

这类故障常见于安装系统过程中,会经常意外的退出安装。实际上这也经常是因为内存的质量不良或稳定性差造成的,多数问题在更换内存后故障解决。此类问题无论是直接从光盘安装还是从硬盘安装都会出现同样的提示信息。虽然有点类似于我们在安装WIN98、WIN2K及XP过程遇到的无法正常读取某一文件,请选择“忽略,终止,放弃”,但那类问题多数是因为光盘的质量差或光驱的使用时间过久,读盘性能下降造成的,同时还会有光驱灯慢闪,并伴随着间断读盘时的“哗哗”声。

如果我们在维修电脑故障过程中遇到此问题时,最好直接更换内存检测,看是否仍旧出现同样的故障。如故障消失,说明原来内存有问题;如果故障依旧,多数是因为光盘质量差或光驱读盘下降造成的,也可能是硬盘上的系统安装文件损坏。

四、内存短路导致主机无法加电

这种情况内存损坏得比较严重,但是内存芯片表面,金手指、阻容并不一定有明显的烧灼痕迹,有时和完好的内存条子一模一样。不过将此内存插入主板后,主板无法加电。当把电源插入电源插头后,按下电源开关,主机无任何反应,CPU风扇和电源风扇都不工作,电源指示灯也不亮,和没有加电时一模一样。故障的判别也很简单,使用排除法和最小系统法。如果遇到一台主机是此类的故障现象,第一步是排除电源故障,如果手中有其他正常电源最好,直接替换。如果没有,可将电源取下,用导线直接短路绿线和黑线,观察电源风扇是否工作,并用耳朵仔细聆听电源内部是否有吱吱的异响。如果有说明电源有问题,质量不稳定,需要更换,

第二步是将声卡、Modem、硬盘、光驱、软驱、显卡、内存、CPU全部去除,只留下CPU风扇,再插入DEBUG卡(如果没有,那需要观察CPU风扇和电源风扇是否转动),开始对主板加电,观察DEBUG卡的指示灯和数码管是否有指示;然后再插入CPU,加电试机;接着再插入内存,一步一步的添加其他部件。如果到某一部件时出现上述的故障现象,那就说明是该部件有问题,需要更换或维修。此方法对于排除系统启动速度慢,死机等也适用。

五、内存损坏导致系统运行不稳定,经常出现蓝屏或无法正常顺利安装系统,总无规律的提示文件读取或解压错误

对于此类问题,首先应排除软件问题。第一步,先对C盘的重要数据进行备份,然后使用“FormatC:/u/c/s”命令对C盘进行强制完全格式化,并仔细观察格式化过程,是否格式化顺利,硬盘是否有坏道。因为硬盘坏道会使系统文件被破坏,造成系统运行不稳定,容易死机。第二步,重新安装操作系统,并注意观察在安装过程中是否有文件无法打开,文件找不到之类的错误。如果没有,基本上就说明硬件方面没有问题,系统不稳定,容易死机,很有可能是系统长时间使用,没有定期进行磁盘扫描和碎片整理,造成系统文件过多的丢失或破坏,而导致系统无法正常稳定的工作。如果在安装过程中出现蓝屏,就需要使用排除法,对内存和CPU进行替换排除。在对CPU和内存替换后故障依旧时,那就必须更换主板进行查验。

说明:有些光驱的读盘性能非常好,在使用两三年后,还是“呜呜”的高速读盘,但是此时因其纠错率下降,使光驱读入的错误数据过多。这些数据如果是用来播放VCD,那不会产生特别大的影响,但是这类光驱读入的数据用于安装系统就极可能会出现上面的类似错误,报文件找不到或解压错误,即使偶尔安装成功,也经常出现“非法操作”,系统非常的不稳定。这类故障比较难于判断,会被判别为内存和CPU的问题,而耽误好多维修时间。

六、内存损坏,导致计算机频繁重启,无法正常运行

对于此类故障,先直接更换内存,看故障是否还仍然出现。如果故障消失,就可以直接判断是内存故障。如果故障依旧,那就需要按第五种故障的排除方法,重新安装操作系统,检查是不是由于系统的原因造成的。

计算机自动重启的故障原因比较多,较常见的是电源功率不足。当计算机满负荷工作,消耗的电力大时,就容易自动重启。还有就是市电电压不稳,变化范围太大或者市电的电源插座接触不良也会产生计算机自动重启故障。但内存损坏后造成计算机自动重启的故障并不多见。

七、内存损坏导致系统启动后不能正常运行,快进入桌面时就自动关机

此问题也需要采用第五类故障中的排除方法解决。提示一点:因为WIN98系统本身的问题,该操作系统很容易遭到破坏。如果我们把C:WINDOWSFONTS的目录名改为其他字母,这时当你再启动系统时,系统就会在出现蓝天白云后,快进入桌面时自动关机。解决的方法也很简单,在启动时按住“CRTL”进入DOS状态,使用REN命令将该目录名改为“FONTS”就可以了。如果是人为的破坏系统,那将会使计算机维修人员费很大的周折,浪费好多的时间,所以做为计算机的服务人员,也应该了解一些操作系统的启动原理和主要文件。

八、内存损坏导致光驱狂读

此类问题我遇到过两次,都是一模一样的表现。只要一开机,自检过后,快进入系统时,光驱开始“呜呜”的高速旋转。即使你不放入光盘它也照转,挺吓人的。在自检过程中也没有任何错误提示,但是在使用替换法更换内存后故障消失。把故障内存放在别的机器上(主板不一样),开机就“嘀嘀”的报警。

九、内存损坏但加电后主机不报警,也不能正常启动

故障机器:主板为硕泰克SL-85DR-C(845D),CPU为PIV1.6G,显卡为GForce2Ti64M,内存为KingstonDDR128M,硬盘为迈拓40G。

故障现象:主机能够加电,按下电源开关后,CPU风扇,显卡风扇转动,电源指示灯,硬盘指示灯亮,但是没有正常启动时“嘀”的一声,显示器显示“请检查信号线连接”字样。

故障排除:仔细观察发现有一个特殊的现象,插入DEBUG卡,加电后,显示“03”,大约4秒钟时,主机断电,电源指示灯熄。再过大约2秒钟,主机再次得电,此时“DEBUG”指示由00经03再跳至“AD”后停止,CPU风扇一直转动,但是始终主机不启动。

对于此类黑屏不启动的故障,采用最小系统逐一排除法最有效,首先去掉内存,加电试机,这时主机会叫了,连续报“嘀嘀嘀”三短声一组的报警声。查知:3短系统基本内存(第1个64K)检查失败。这不同于一般内存报警的连续“嘀”声,但可以估计是内存出现问题。

于是把内存插到验机台上,一开机就是连续的“嘀嘀”声,果真内存坏了。

2.内存故障问题 篇二

随着人们对网络程序的安全性要求越来越高,Java以其高安全性的特点迅速成为现代最流行的高级编程语言之一。尤其是它特有的内存管理机制———垃圾收集器 (Gargbage Collector, GC) ,减轻了程序员的负担,减少了许多内存泄露的可能性,提高了程序的安全性。然而,这并不是说在Java中不存在内存泄露的问题,只是Java的内存泄露比较隐蔽,为了提高程序的安全性和稳定性,Java中的内存泄露是值得我们深刻分析一下的。

2 Java内存泄露

内存泄露,通常是指分配出去后却无法回收的内存空间。

2.1 传统语言中的内存泄露

在传统语言(如C/C++等)中内存泄露的范围和发生的可能性是十分大的,程序员需要自行管理内存,如果程序中为变量或对象申请了内存空间,则在不需要时必须调用相应的函数进行显式释放它们占用的内存空间,即使超出变量或对象的作用域,否则这块内存将永远得不到回收直至系统重启。因此可见,传统语言中一旦发生内存泄露,其危害性是不言而喻的。

2.2 Java中的内存泄露

针对传统语言的不足,Java中一个很大的改进就是引入了垃圾回收器(GC)的机制,它使程序员从传统语言复杂的内存管理中解放出来,将更多的精力关注于业务逻辑的开发,程序员只需要用关键字new或者用Java的反射机机制为对象开辟一块内存空间,在对象不再使用时,而不需要进行显式的释放,这块空间会被GC自动回收,这种收支两条线的内存管理机制有效地解决了传统语言中的内存泄露问题,极大地提高了编程的效率。尽管如此,GC的引入并不能完全避免Java中的内存泄露。Java中的内存泄露和传统语言中的内存泄露是十分不同的,它是指对象不再被需要时,但却仍被程序无意识地、错误地保持或引用而导致GC无法回收对象所占用的内存空间。因为在GC看来,它们还是“有用”的,即Java中的内存泄露是主观的内存泄露,大多是由于程序员的一时大意而造成的。

可以用图论来描述Java中的内存泄露。把对象看成是有向图的顶点,引用关系看成是有向图的有向边,有向边从引用对象指向被引用对象,线程对象作为有图的起始顶点,如图1所示。

注:执行o2=mull欲释放对象2, 但还被数组对象引用着, 于是被泄了

通过图1可知,Java中的内存泄露的对象具有以下两个特点:首先,这些对象是可达的,即在有向图中存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。

3 表现形式

由于有了GC的帮助,那些“不可达”的对象将不会再被泄露,Java中内存泄露的机率降到了很低。因此,Java中内存泄露往往并不像传统语言中那样表现得很明显,使程序很快出现致命地错误,但往往会在系统运行一段时间后就会暴露出来。

3.1 瞬间泄露

瞬间泄露是指由于程序在短时间内保持了大量的无用对象的引用而导致堆内存不存或耗尽。它对应用程序来说是致命的,在软件开发过程中一般都能被检测出来,因为不解决它,程序是无法正常运行的。其很明显的表现形式就是操作过程中程序瞬间抛出java.lang.OutOfMemoryError,即内存溢出。虽然可以通过扩大堆内存空间的方式解决瞬间泄露的出现,但内存的增长毕竟是有限的,而且这种解决方式很有可能把瞬间泄露转成下面将说的另一种更为隐蔽的泄露形式———缓慢泄露。

3.2 缓慢泄露

缓慢泄露是指程序每次只泄露少量对象,短时间内不足以影响程序的正常运行,但运行时间一长,程序必定会因为内存不足出现java.lang.OutOfMemoryError错误。它具有隐蔽性、泄露周期长的特点,所以在开发过程中最容易被忽视,这部分内存泄露也是Java内存泄露中的最主要形式。下面是一段缓慢泄露的程序。

在上面的例子中,EmulateStack类模拟数据结构中的栈,使用intoStack和outStack方法进行进栈和出栈,pointer指向栈顶位置,在main方法中,初始化了一个大小为5的栈,然后把一个Object对象入栈,接着又把它出栈,这时Object对象占用的空间就被回收,事实上并非如此,outStack方法只是减少了栈顶指针pointer的值,栈中仍然保持着对Object对象的引用,该程序每执行一次,都会泄露一个Object对象。实际上,我们只要修改outStack方法,即可解决内存泄露的问题。修改如下:

4 原因

4.1 客观原因

主要是由于GC的机制所决定的,GC和程序员对垃圾的认知角度是不一样的。在GC看来,凡是不可达的对象都是垃圾,凡是有句柄指向的对象都是正在使用的对象,不应该被回收;而在程序员看来,程序不再需要使用的对象都是垃圾,而实际上,这些“所谓的垃圾”还是被某些正在使用的对象引用着的,程序员认为它应该被回收,而GC却不会回收它们。另外,GC参数的设置不当,也会增大内存泄露的可能性。

4.2 主观原因

主要是由于程序员的编程水平或疏忽大意,而错误地、无意识地保持着某些无用对象的引用而造成的,这在Java内存泄露中十分常见。

在上面的例子中,程序循环申请Object对象,然后将对象加入一个List容器中,然后试图通过o=null将对象所占用的空间释放掉,其实这是不可行的。因为List容器还持有对Object对象的引用,所以GC不会回收这些Object对象,只有用list=null或list.remove (o) 才能释放这些对象。

5 解决方法

5.1 提早预防内存泄露(1) GC调优

不同的JVM采用了不同的垃圾回收机制和启动参数,有的GC是定时启动,有的是当CPU资源空闲时开始收集垃圾,有的是当堆内存不足时才开始收集。因此,优化GC配置对预防内存泄露十分重要。GC的算法和参数对应用程序的影响是十分大的,不适当的垃圾回收机制和参数可能为程序的内存泄露埋下了隐患。

下面将以最流行的JVM———SUN公司的HotSpot虚拟机为例来说明一下GC如何调优。

HotSpot是用“分代”方式来管理堆空间的,它将整个堆空间分成了三块:永久代(Permanent Generation)、年老代(Old Generation)、年轻代(Young Generation)。年老代保存反射创建的对象,年轻代保存刚刚实例化的对象,当年轻代被填满时,GC会将一部分仍存活的年代代对象移入年老代。针对Hotspot的GC,以下几条优化的原则:

1)最好将-Xms和-Xmx设为相同值,让-Xmn的值等于-Xmx的1/3。

2)一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒内完成。

3)增加Heap空间的大小虽然会降低GC的频率,但也增加了每次GC的时间,并且GC运行时所有的用户线程被暂停,也就是GC期间,Java应用程序不做任何工作。

4)尽可能增大Heap空间,除非应用程序遇到了较长的响应时间。

(2)良好的编程习惯

高效优质的代码可以在很大程度上减少内存泄露的可能性。为了避免内存泄露,最主要的原则就是尽早释放对“无用”对象的引用,即在对象不再需要时,用“对象=null”的方式显式释放对象,以便GC能尽早回收它所占用的内存空间。许多程序员在使用临时变量时,总是让它在退出作用域后自动释放所引用的对象,这对于一些逻辑结构简单的程序可能影响并不大,但对引用关系较为复杂的大型应用,就有可能对临时变量还持用一些错误引用而导致临时对象不能被释放。下面给出几条提高编码效率的建议。

1)尽量少用临时对象

临时对象的存活周期非常短,很快就会变成垃圾,它会使GC频繁启动,从而降低应用程序的性能。

2)尽量不要显式调用System.gc ()

因为此方法只是建议JVM进行垃圾回收,至于什么时候回收还是不确定的,JVM可能会在不该进行回收时而启动GC,导致应用程序临时中断。

3)尽量少用finalize方法,它会使GC的收集时间增长。

4)对象在使用时再实例化,无用时尽早释放对象的引用,即对象句柄=null。

5)尽量避免在类的构造函数中创建大量对象,防止在调用其自类的构造方法时造成不必要的内存资源占用。

6)尽量不要显式申请数组空间,这样会造成堆空间浪费。

7)能用基本类型的就不要用封装类型,如能用int型的,就不要用Integer类型。

8)避免过深的类层次结构和过深的方法调用,因为这两者都是十分耗内存的。

9)对于字符串的操作,尽量用StringBuffer类的appand方法,不要使用String及+,因为对String的每次操作都会产生新的对象。

10)尽量少用static变量,因为它属于全局变量,直到应用程序退出才会被GC回收。

5.2 内存泄露的检测

(1)代码走查

它是安排有经验的开发人员或对整个程序代码很了解的人员对系统进行仔细排查,找到内存泄露的地方。它对于引用关系不是太复杂的小型系统往往十分有效。

(2)利用专业工具

市场上检测Java内存泄露的工具十分多,如JDK6.0的命令行工具JPS, Borland公司的OptimizeIt, Ej-technologies公司的Jprofiler等,它们的工作原理大同小异,都是通过监测Java程序运行时所有对象的创建、释放等动作,将内存管理的所有信息进行统计、分析、可视化,开发人员将根据这些信息判断程序是否有内存泄露的问题。下面简单介绍一下Jprofiler查找内存泄露的基本思路。

Jprofiler 5.1.3是一个全功能的Java剖析工具,专用于分析J2SE和J2EE应用程序,它直觉式的GUI让你可以找到效率瓶颈,抓出内存泄露,并解决执行绪的问题。Jprofiler的内存视图就是用来观察系统运行时堆内存的大小,实际使用的大小和各个类的实例分配个数。如图2所示,各列自左到右分别为类名称、当前实例个数、自上次标记点增长或减少的实例个数、占用内存的大小,最下一行是当前JVM的汇总数据。

在现实生产中,可以分别在系统运行2小时为间隔点,点击“快照”按钮,记录消退时的内存状态,抓取当时的内存快照,找出对象个数增长比较靠前的类,记录这些类的当前对象个数,记录数据后,点击上面的“标记”按钮,将该点的状态作为下一次记录数据的比较点,一个正常的系统其运行时的内存占用量一般是比较稳定的,不会随着时间的增长而增长,同样,一个类的对象也是有一个上限值的,不会无限制地增长,可以通过得到的内存快照,对这些快照进行综合全面的分析,如果有某类对象的内存占用空间一直都在增长,那么就可以初略认定该类对象可能存在内存泄露,接下来,再只对这些可疑对象进行仔细监控分析,必定会找到内存泄露的对象和地方。

6 结语

综上所述,Java的内存泄露主要是由于一些无用对象被错误地保持着,导致它们的空间不能被GC回收造成的。因此,它经常并不容易被发现,本文旨在帮助大家更容易地找出内存泄露,解决性能瓶颈,提高程序的稳定性。

参考文献

[1]陈小玉.Java内存泄漏泄露问题的改进与研究[J].微型电脑应用, 2005, 21 (7) .

[2]关锋, 卢铁, 关威.关于Java的内存泄漏[J].信息技术, 2003, 27 (6) .

[3]Jonathan Knudsen, Patrick Niemeyer.Learning Java, 3rd Edition[M].O’Reilly, 2005.

[4]于海雯, 刘萍等.Java的内存管理与垃圾收集机制分[J].电脑知识与技术, 2006, 20.

3.内存故障问题 篇三

后来在网上瞎逛时,发现可以用Thaiphoon这款软件来修改内存的SPD,心里不免有一些窃喜,能不能通过修改内存的SPD来让它们兼容并且完全工作在400M的频率下呢?于是一项艰难而又惊险的工作开始了

准备工作

下载Thaiphoon 3.0.2.0,用来刷新保存内存的SPD信息和CUP-Z,用于检测内存的工作频率用延时。

修改实战

直接运行Thaiphoon 3.0.2.0可进入主界面,首先选择工具栏中的“EEPROM”选项(如图1),就会看到系统中读取两组内存SPD信息的项目“Read SPD at 50h”、“Read SPD at 51h”,分别对应内存插槽上的“DIMM1”和“DIMM 2”的内存模组;也可以直接点击工具栏的Read图标,选择要读取的SPD信息。在读取内存SPD信息时,首先要确定自己的内存插在哪个DIMM(内存槽)上,千万可别搞错了。这个可根据CPU-Z的检测信息判断,插槽#1代表在第一个DIMM上,即50H。

读取50h的内存信息,也就是笔者的Kingston内存,待内存SPD信息读取完毕后,选择“File/save Dumpas”命令(如图2),输入保存的文件名为Kingston,就可以将其另存为一个以“THP”为后缀的文件了(一会要将这个信息刷入Kingmax内存条中)。然后再读取51h的那一条,保存为Kingmax。这一步很重要,一定要先保存原来的信息,以备刷新失败后好重新刷回来,读取SPD时间大约在10秒钟左右。

分别保存好两个内存的SPD文件后,选择工具栏“File/Load Dump”命令或点击工具栏上的Load图标,调入Kingston内存的SPD文件,选择“EEPROM/FullRew rite”命令或点击工具栏的Write图标,会出现一个写入时的操作选择。系统默认写入是50H DIMM槽,即第一个插槽的内存,由于这里要更新的是第二根插槽上的Kingmax内存,而且第二条内存在51H DIMM槽,因此要手动将50改为51,即写第二条内存。在写入时,一定要确定要写内存所在的DIMM槽,然后手动输入对应的组号。确定后,点击Write按钮,系统将自动将调入的新SPD信息写入到内存SPD芯片中,整个过程大约需要20秒。

刷新完毕,笔者怀着忐忑不安的心情重启电脑后,机器顺利的启动了。系统检测出机器内存总容量为768MB.并且工作在DDR400规格下,心中真是狂喜不已啊。进入桌面后,用CPU-Z检测发现,笔者的Kingmax的内存信息完全变得和Kingston的内存信息一样,包括延时与默认的工作频率(如图3)。后来超频时发现,那条修改了SPD信息的Kingmax内存可以工作在更高的频率下了,可以说了,有质的飞跃。

最后提醒大家,不是每一根内存都能刷新SPD信息,一定要看你的内存有没有这个潜力,还有一定要保证刷新时不能断电,如果刷新过程中断电,就只有拆下SPD芯片用编程器刷写了。

4.内存故障判断分析 篇四

2用两电脑没声音条以上内存遇到的故障:

有的时候,当系统安装两电脑没声音条以上内存时,会出现容量不但不增加,却反而减少的现象,主要原因是由于内存与主板的物理“Bank”支持数量不匹配而造成的。当主板拥有4个内存插槽且全部插满的时候,出现故障的概率则会更高一些。并且,主板所支持的Bank数量与采用的芯片组有着直接的联系。故在升级内存时大家必须注意:并不是说主板具有4个内存插槽,就可以支持4条内存,还需查看内存的“Bank”数与主板支持的物理“Bank”数是否匹配。另一方面,除了为支持双通道而采用两电脑没声音条内存之外,建议大家还是使用单条大容量内存为佳,以避免这种情况的发生。

3主板与内存的兼容性故障:

5.常见内存故障及处理方法 篇五

●内存检测时间长

别人的电脑在开机时检测一遍,但我的电脑检测3遍,我的128M 内存检测时间太长了,

方法:设置Quick Power On Self Test 和Esc 键。

步骤:开机时,按Del 键进入Setup ;选择BIOS Features Setup ,回车;使用PgDn 键把“Quick Power On SelfTest”设置为“Enabled”;使用F10键退出(回答Y);开机自检内存时,按Esc 键跳过自检。

说明:随着内存价格急剧下降,电脑基本配置内存容量的增加,开机内存自检时间越来越长,即使使用快速检测,把三遍检测改成一遍检测,时间也不短,因此需要使用Esc 键直接跳过检测。以后Setup 一定会有完全不检测内存的开关。

●不识别128MB 以上内存?由于内存条便宜了,我就安装了很多内存条,结果发现136MB内存只检测到128M 内存,其余的内存哪里去了?

方法:主板限制。

步骤:略。

说明:主板有个指标,就是最大内存容量支持。一般的限制是256MB,高的512MB。而128MB是比较低档的主板的内存容量限制。只能更换主板。因此,与其增加内存条不如更换主板和CPU。

内存数量与实际不符

●整条内存丢失

开机后内存数量成为8M 了,原来我的电脑开机时显示的是16M。这根本无法解释,我使用的72线内存条。CPU 是586、64位的,而72线内存条是32位的,必须两条两条的插,可是我插的两条8M 内存条怎么会变成8M 呢?如果是一条接触不良,电脑应该不能工作呀??方法:更换内存条?步骤:略。

说明:因为内存条与主板存在兼容性,因此有可能出现这样的问题,

这时是不能根据两条32位内存条同时有效的理论解释的。

●内存部分减少

开机后,在Win 95中发现内存减少了1MB,本来应该是16MB的。

方法:区分集成显示卡主板共享存储器、BIOS 保留15-16M 的空间给扩展卡、Smartdrv 占用问题。

步骤:如果您使用的是集成在主板上的显示卡,而显示卡与主板共享内存,就会发现这样的情况。开机后,内存自检时显示的内容与正常主板显示的内容不一样。正常主板只显示一个内存容量,而集成声卡主板会显示“15360MB+1024KBShared Memory[a1]”,表示16M 有1M 用于显示缓存了。

开机,按Del 键进入BIOS 设置,把“ChipSet Fea?tures Setup”中的“Memory Hole At 15M-16M”设置成“Disabled”。

如果设置成“Disabled”后,系统或某个扩展卡不能稳定地使用,请恢复上面的设置为“Enabled”。

如果上面的选项是本来就是“Disabled”,就接着检查Smartdrv 占用。

检查Smartdrv 占用:开机后,进入MS-DOS 兼容方式,使用Edit C:Autoexec .bat 把发现的Smartdrv 命令删除掉或在前面加注释前缀Rem。

●常规内存减少1K?我在使用电脑的过程中无意发现,常规内存只有639K,是否存在故障??方法:检查病毒、看CMOS 参数。

步骤:把杀毒软盘插入软驱;开机;在出现A>后,输入KV300;出现提示后,输入C和回车;杀毒工作就开始了。

6.解决主板内存插槽故障方法论文 篇六

CPU、西部数据20G(7200r)硬盘、HY

Pc-133内存。按理,作为家庭用的电脑,128M内存是足够的,这是怎么了?再看看系统属性,发现属性的性能状态栏显示:内存:64MB的RAM;系统资源:54%可用……等等。怎么?我买的电脑明明是128M内存,怎么变成了64M呢?于是打开“优化大师”的系统信息检测显示,物理内存63028Kb(31%可用),其他信息显示与我购买时的相符。还是64M内存,这究竟是什么原因?

联想到一个月前我的电脑曾送到电脑城修理过,我的第一感觉是遭了,我的电脑内存条被人调包了。提起电话想质问电脑城,才想到是春节期间,哪里找人啊!没办法,还是自己先看看再说。

我赶紧关掉电脑,断开电源,并迫不及待地打开机子,查看我的“爱机”,我拔下内存条一看,好象还是我的“原装”双面内存HY

128Mb

Pc-133,什么原因呢?我仔细查看内存条上的每一金手指,也并没发现有断脚的情况,用小刷轻轻刷干净每一根针脚,再小心翼翼地卡上内存条,开机,显示器上指示灯亮,但没有信号反映。是不是有什么地方没接触好,我只好关掉电源,重新检查显示器与主机的联接线,重新开机,问题依然。什么原因呢?

我反复查看,重新连接,开机,显示器亮了,并进入了Windows98画面,我一阵兴奋,但随即出现的是pleaes没办法,偶然记得以前我的电脑内存条是安装在DIMM2位置上的,怎么现在安在了DIMM1上,拔出内存条,插入DIMM2,开机,随着光标的快速闪动,一阵清脆的电脑启动音乐响了,我的心跳随着光标的一闪一闪快速地跳动着,电脑正常启动了,打开一个个窗口,发现速度明显快了许多,似孚又回到从前,赶紧查看系统属性,属性的性能状态栏清晰显示出,内存:128.0

MB的RAM……“成功了!”

我惊喜万分。

再回过头来看看DIMM1插槽,问题终于发现了,原来,DIMM1插槽上第7个针脚的一根金属片已经严重锈蚀断裂了,致使我的双面内存条实际上只发挥了单面的作用,电脑当然只能检测到64M内存。

电脑软硬件应用网站长注解:虽然该文已经比较老,但是例子值得借鉴,很多时候会忽略该问题。

电脑频繁死机竟是灰尘所致!主板离奇故障排除

由于主板的集成度相对比较高,因此出现故障的机率也相当大。当电脑出现有规率的死机、反复重启或是主机根本无法点亮时,我们一般认为是主板上的某个部件出现了问题。主板的高集成度,也让其维修起来相当不易。随着价格的不断降低,如果主板某些重要的芯片组被烧毁,一般情况下便没有维修的必要了。

对于主板发生的故障,我们可以简单的分为以下几类:一是根据对电脑系统的影响可分为非致命性故障和致命性故障,致命性的故障一般是按下电源开关后主机无任何反映,或是在系统上电自检期间,导致系统死机。非致命性故障也发生在系统上电自检期间,一般给出错误信息;或是能够正常进入系统,但经常出现死机或反复重启。

引起主板故障的主要原因,一是人为故障:带电插拨I/O卡,以及在装板卡及插头时用力不当造成对接口、芯片等的损害;二是环境不良:静电常造成主板上芯片(特别是CMOS芯片)被击穿。另外,主板遇到电源损坏或电网电压瞬间产生的尖峰脉冲时,往往会损坏系统板供电插头附近的芯片。如果主板上布满了灰尘,也会造成信号短路等。三是器件质量问题:由于芯片和其它器件质量不良导致的损坏。

首先要提醒用户的是,灰尘是主板最大的敌人之一,也是电脑各种配件产品的最大杀手,大家最好要注意一下。在很多情况下,主板无法查出故障,通过利用三氯乙烷(挥发性能好,是清洗主板的液体之一)清洗后“怪病”完全消失,大部分都是由于灰尘造成的。为了保证“怪病”不出现,最好注意防尘。还有就是在突然掉电时,要马上关上计算机,以免又突然来电把主板和电源烧毁。最近笔者碰上几起类似的事故,接下来将排除方法介绍一下,希望大家引起足够重视。

故障一

故障现象:底装的电脑,CPU为奔腾4

2.4C,主板选择了精英865PE。使用至今,没有出现过大的毛病。自电脑摆到卧室后,但没有移动过位置,也一直都没有注意电脑清洁问题,前段时间电脑经常出现蓝屏、非法操作或死机的故障。当时觉得这些问题出现的时间没有规律,而随着时间的推移,死机越来越频繁。

故障分析:先是怀疑电脑中了病毒,用各种杀毒软件反复检查都没有发现病毒。接着怀疑启动时加载的程序有冲突,就又把所有启动时运行的程序关闭,但故障依然存在。随后又怀疑内存有问题,借了一条KingMax内存,用它换下自己的HY内存后,还是死机。最后只好重装系统,但安装过程中却又死机。马上想起可能是CPU引起的问题,打开机箱,发现主板上积满了灰尘,通过仔细观察,这才发现原是灰尘导致引脚之间短路而频繁死机。

故障排除:用旧牙刷刷去灰尘,但这还不够干净。由于没有无水酒精,接着就用光盘清洁喷剂擦拭,再用电吹风吹干。待主板清洁干净之后,重新安装各种配件后开始安装Windows系统,安装过程非常顺利,装好后的系统再也没有出现过无故死机的现象了。看来电脑也需要经常的清洁与保养,如果忽视了对电脑的清洁,灰尘就会越积越多,各种各样的故障就会频频发生,更甚者由于散热不良导致各种配件的烧毁,因此千万不要忽视主板的清洁。

故障二

故障现象:朋友的一台组装大约有两年多的兼容机,最近经常无法启动,偶尔能进入系统也是频繁死机,无奈之下只好向本“大师”求援。

故障分析:根据朋友述说的故障现象,笔者初步判断为病毒所致或者硬盘本身出现了问题。按照先软后硬、先简单后复杂的检修原则,拿出最新的KV3000杀毒软件准备对硬盘进行查杀,可是用启动盘进入DOS模式后,却提示找不到各驱动器,看来杀毒是无法进行了。

重启电脑并进入主板BIOS,发现硬盘参数无不当之处,但自动检测却无法识别硬盘。看来只有检查硬件了,打开机箱,将硬盘电源线与数据线拔下重新插好,开机还是无法识别硬盘。难道是硬盘出了问题?将硬盘拆下接到笔者的爱机上,能够正常工作,也就是说硬盘没有问题。难道是数据线坏了?用笔者的数据线把硬盘重新接到故障机,故障依旧。会不会是电源的问题,换上笔者的长城电源,还是无法唤醒硬盘。

故障排除:仔细观察主板,硬盘接在IDE1接口,光驱接在IDE2接口上,光驱能使用为什么硬盘就有问题。试着将光驱拆下,将硬盘接到IDE2接口上,硬盘竟然能正常使用了。邪门,何以IDE2完好而IDE1出故障,它们可是由同一主控芯片控制的啊!

无奈之下,只好拆下主板进行观察,这时发现其背面有好几处布满了灰尘,其中有一处正好位于IDE1接口的焊点处,堆积的灰尘几乎将焊点覆盖了。将灰尘清理干净,固定好主板,装好各配件,重新启动计算机,顺利地进入了系统,一切恢复正常。

这两起故障,都是由于没有定期清洁所引起的。灰尘是电脑的隐形杀手,堆积的灰尘不但妨碍了散热,易于损坏元器件,而在潮湿天气还会造成电路短路现象。灰尘对计算机的机械部分也有极大的影响。因此,定期给爱机做卫生显得格外重要。

能“活”过2年吗?浅议主板爆电容

IT行业发展到今天,PC板卡的竞争日益激烈,大小厂商纷纷想尽办法降低成本,于是许多厂商将原来使用的日系电解电容换成了台湾等地生产的“杂牌”,这其中几乎包括了从一线到二线的所有厂商,但是问题接踵而来,先是升技(ABIT)的爆浆事件曝光,接着是是磐正(EPOX)使用的GSC大量爆浆,近日著名厂商华硕(ASUS)也发出了电容爆浆警告……于是众多厂商又兴起了新一轮的电容换装风暴,有些厂商甚至声明所有电容全部换装日系大厂产品,例如板卡新锐厂商青云(Albatron)义正辞严地表示:为了避免一些厂商因为使用了低品质电容导致的爆浆,青云仅使用来自日系松下和三洋的大容量(>1000μf)低ESR电容。立即有52硬件网友出来质疑,为什么“27颗(台湾产)GSC电容站在青云865PE的肩膀上”?

为何主板电容会爆浆?

如果细心的话,您会在主板上发现排排林立的圆柱形元件。尤其在CPU插座旁边非常密集,这些就是电容了。电容作为主板电源模块的重要组成部分作用是滤波,可以把脉动直流变成近似直流。所以在主板上会有不少电容来滤除相关电路产生的杂波,特别在CPU周围有的主板会有多达10余个电解电容,这是因为CPU工作在几百兆甚至数G的高频下(是工作电流很大),必须保证电源的纯净,这时就需要使用大容量的电解电容来滤波。由于主板的安装空间和限制,只能使用十余个小容量的电解电容(6.3V1500UF)并联的方法来达到大容量电容的效果。当电解电容的容量下降时,供合CPU工作的核心电压就会变差(一共2点1是内核电压降低,2是CPU供电干扰增大),其中会窜入周围电路产生的杂波和开关电源电路自身的波形,这时主机就会表现出系统极端的不稳定,运行速度下降,容易蓝屏死机。

(电容爆浆最根本原因只有一个就是温度,超过允许温升或者在允许温升情况下达到使用寿命。包括超压。超压导致介质击穿产生高温最终爆炸。)高温度是导致电容爆浆的主要原因,高温致使其电容内部电解液沸腾,压力升高,最终超过泄爆口的承受极限而爆浆。电解电容因为其结构特性,内部装有电解液,在使用过程中如果出现过压现象,这时电容的漏电流增大,电容会在短时间内迅速发热,导致电容的温度升高,电容内部的电解液会因高温变成气体致使电容内部的压力增大。当这个压力超过电解电容的铝外壳承受压力的时候,电容就会发生爆炸。为了避免电容爆炸造的不必要的人身和物品损伤,每个电解电容的顶部都有刻上防爆纹,就是十字或三叉及其他形状的压力释放点,这是人为的制造压力薄弱点,当电容内部压力过大时,就会从此处泄压,避免产生爆炸情况,有点类似高压锅安全阀的原理。按照技术标准,这些电容都应该能在105摄氏度以内的环境正常工作,事实上也没人能在105摄氏度以上的环境中生存,因此用户的使用环境不足以造成电容爆浆,最大的原因就是主板厂商选用的元件不合格。爆浆主板保修成问题

52硬件版主就差异性详细与这位主板工程师进行了探讨,才知道原来同样容量标称的电容,按工作寿命可以分为:1000小时、小时、3000小时、4000小时、5000小时、8000小时等多种规格。怪不得有些电脑在过了保修期限之后,就特别容易坏掉,原来材料的选择有这么多学问。他说,“我觉得主板根本就不能采用2000小时以下的产品,虽然大多数人每天开机不会超过8小时,但是按照常识来说,这样做很愚蠢。目前市面上大多数主板采用的都是3000小时左右的电容,好点的用5000小时,只有服务器主板才舍得用更高级电容。一般来说,按照这个模式设计出来的产品,可以轻松度过保修期,但是过了保修期之后的半年至1年,就进入一个故障的高发区间。”(问题不在这里。而是2个地区的标准不一样,爆浆的台湾标称寿命一样是2000h,但是这个标准和日标的2000h的测试和标定方法是不一样的,同样的日标和美标,欧标也不一样。同样都是5000h欧标电容用过都没问题,日标的早流汤了。这个设计到设计余量问题,设计余量越小电容实际寿命越短。)

按照这样的做法,过了保修期主板也进入元器件老化的高发期,商家既节省了成本,又避免了保修带来的成本增加;而消费者对这种行为实际上根本没有任何法规上的保障。记者问该工程师,“2年~3年之后,电脑因为电容老化坏掉怎么办?”他笑着说,“按照我们的设想,也该买部新的了,如果实在缺钱的`客户,可以考虑去修理主板的地方换掉这些电容,加上手工费也就是几十元而已。再要不就是去买那些真正3年保修的主板,例如Intel原装板,华硕的主板等。这里要小心,有很多所谓3年保修的主板,只有第1年是免费的,后面两年是收费服务。另外,在购买主板的时候,注意一下鉴别电容就可以大致判断这块板的好坏。”爆浆深层分析及厂商苦衷

底至第一季升技(Abit)生产的815系列主板(SL6、SA6R、SE6),在使用1年左右就陆续出现大面积电容爆浆问题。究其原因,发现是因为使用了Jackcon(融欣电子)生产的电解电容。升技因此事件致使品牌形象受损,订单流失,加上给客户更换新电容的费用,当年亏损高达6.2亿元。

其后又有多家厂商不断传出主板电容爆浆问题,不过因为影响范围不是很大,也就是磐正(EPOX)主板的GSC大量爆浆了一次,据说还是用错规格。到了月4日,一线大厂华硕承认其制造的K8VDelux主板,存在电容爆浆的危险。在官方网站上,华硕用FAQ的形式解释了该问题,并用图示将可能出问题的电容都用红色圈圈标注出来了。华硕表示该款主板的电容有可能会在使用过程中出现不正常的现象,如果客户的K8VDelux出现了问题,可以联系当地华硕相关部门进行更换。到目前为止,由于华硕及时在官方网站上做公开的申明,其承担责任的勇气和胆识,避免了品牌信誉受损。

在爆浆事件频繁发生后,很多主板厂商纷纷用回日系的高品质电容,但是情况也不一定,变化随时在发生。之前有人质疑青云(Albatron)的865PE主板使用GSC电容,经调查情况属实,但是同样一个型号,也有使用日系SANYO电容的版本,消费者要搞清楚相当不容易。为什么厂商就不能从消费者的角度出发,精选原料好好控制主板的质量呢?

52硬件编辑采访到一位主板厂的技术人员,他表示:目前主板的厂商获利率是1%~3%,最新款的还可以更高些,但很少超过5%的获利;加上主板的生命周期越来越短,材料成本的控制就需要相当谨慎。必须在3~6个月内获利,否则连1%的利润都没有,选择低成本的电容当然是没办法的办法。名牌电容的确好,但是价格贵,选择指标看上起相当的平价电容,在一段时间内根本没区别,只有使用时间长了才能有所差异。看电容辨主板优劣

那么,怎样从外观上来简单判断主板电容的好坏呢?据专家介绍,可以从以下几方面入手:

看电容颜色

一般来说黑色的电容最差,绿色的电容要好一些,蓝色的电容要比绿色的电容更强。所以我们一般在主板上看到的CPU周围滤波电容都用的是绿色的,而其它地方有些则是黑色的。电容个头大了也不一定好,同样容量的耐压值的电容个头小了好,个头大的话,只能说明其生产工艺落后。(不知道哪个假专家讲的。日系电容的简单推断可以从外皮字的颜色推断,白字一般为普通品或其他品种,金字的为高频高速电容,金字带audio字样为音频电容,与外皮颜色与该电容系列有关无规律可寻。最可靠的辨别方法是看系列,什么厂生产的什么系列电容是做什么用的厂家网站一般都有详细技术资料PDF格式的。包括用途,寿命,规格,尺寸)

看电容指标

按照Intel主板技术白皮书的说法,现在主板CPU插槽附近的滤波电容单个容量最低为1000μF,一般主板都采用1000μF的电解电容(很会精打细算啊)。而在Intel的原装主板上,电容单个容量高达3300μF,这就是大家推崇Intel主板稳定性的原因之一。在耐受温度范围上,大部分主板都使用的是105℃的电容,如果看到使用的是85℃电解电容,耐久性就不用多说了

正确对待主板检测的CPU温度

网友问:

我的电脑一开机,BI0S就显示CPU温度为48℃(室温25℃左右),不运行任何程序几分钟后温度也会上升到54℃。这是什么问题?长期下去对硬件是否有影响?我该将主板中的CPU警戒温度设定到什么值?

52硬件论坛答:主板检测CPU温度都是依靠CPU座下的探温头完成的。探温头做得高一些,就离CPU近。所探测到的温度就高;探温头做得低些。就离CPU远些,所探测的温度也就低。该温度显示的高低并不会对硬件工作造成影响。

设定BIOS中的CPU警戒温度的依据主要是CPU所能承受的极限温度。一般警戒温度设置为比它所能承受的极限温度低20℃左右即可。

主板故障排除实例

主板作为电脑核心,由于其电路集成过高,因此出现故障的机率非常大。散热不良、电容击穿等,都会导致整个系统的瘫痪。一般人认为,只要是主板出现了问题,一般情况下不能通过常规方法维修,因而一旦电脑主板出现问题,往往是重新买一块新的了事。

其实不然,电脑主板虽然大部份部件都是高集成芯片,但也不乏普通电路中常用的电阻、电容、二级管、三级管等,特别是一些大功率管由于经常通过大电流,因而发热量较大,加之电脑主板尺寸限制,散热片不可能做得很大,特别是有些机箱狭小,热量不易散出,所以这些大功率管有时会在超过它最高工作温度下工作,长时间使用难免出现问题。接下来笔者就将自己在使用电脑中遇到的主板故障及排除方法简单介绍一下,有遇到同类故障的朋友不妨借鉴一下笔者的维修经验,没准能够让你的计算机重新恢复动力,为你节省许多的银子。

电脑无法启动,主板灰尘过多成真凶

故障表现:朋友的一台两年前组装的兼容机最近经常无法启动,偶尔能进入系统也是频繁死机,严重影响了朋友的工作及游戏娱乐。

故障分析与排除:根据朋友描述的故障现象,笔者初步判断为病毒所致或者硬盘本身出现了问题。按照先软后硬、先简单后复杂的检修原则,拿出最新的杀毒软件准备对硬盘进行查杀,可是用启动盘进入DOS模式后,却提示找不到各驱动器,看来杀毒是无法进行了。

重新启动电脑并进入主板BIOS,发现硬盘参数无不当之处,但自动检测却无法识别硬盘,这样的表现看来软件方面的问题不大,只有检查硬件了。打开机箱,将硬盘电源线与数据线拔下并重新插好,开机还是无法识别硬盘。难道是硬盘出了问题?为彻底排除硬盘故障,将朋友爱机上的硬盘拆下接到笔者的机器上(设置跳线为从盘),开机会利用硬盘检查软件对这块硬盘进行扫描与检查,并没有发现问题。对硬盘进行数据复制与粘贴操作,也能够正常进行,说明硬盘本身并没有任何的问题。

难道是数据线或电源线有问题?笔者将一条新的数据线重新接到计算机上,并更换了一个电源的四针梯形插口,重新开机,故障依旧。会不会是电源功率不足呢?笔者对朋友机器上的电源进行了全面的检查,发现朋友使用的是长城300W电源,问题应该不大。这是什么原因呢?难道不是主板出现了问题。

仔细观察主板,硬盘接在IDE1接口,光驱接在IDE2接口上,光驱能使用为什么硬盘就有问题。试着将光驱拆下,将硬盘接到IDE2接口上,硬盘竟然能正常使用了。邪门,何以IDE2完好而IDE1出故障,它们可是由同一主控芯片控制的啊!无奈之下,只好拆下主板进行观察,这时发现其背面有好几处布满了灰尘,其中有一处正好位于IDE1接口的焊点处,堆积的灰尘几乎将焊点覆盖了。

会不会是这些灰尘导致的IDE1接口问题,不管这些,先将灰尘清理干净再说。清理后固定好主板,装好各配件,重新启动计算机,顺利地进入了系统,一切恢复正常。正是这些不起眼的灰尘成为本次故障的真正凶手。

7.内存故障问题 篇七

下面先探讨ISO/ANSI C++中内存访问中值得注意的几个问题。

1 数组使用

数组是一种线性表数据结构,系统为其分配连续的内存空间,即数据元素按索引顺序连续存储,可以通过下标运算方便快速地访问其中数据,它在程序设计中被频繁使用。以下3个问题需要注意:

1)声明数组时指定的长度一定是常量表达式

2)访问不要越界,包括数组上界和下界

假设有数组int A[10];,则A[i]中的i只能为0到9,而小于0或大于9都属于越界,越界访问可能导致不可意料的错误,例如试图访问的操作系统所占用的内存,非常危险。C++编译器并没有给数组访问做越界检查,因此只有程序员谨慎使用。

3)数组长度不能过大

数组所占用的空间是连续的,即一个元素的空间紧挨着下一个元素的空间,这些空间是由编译系统自动分配的。编译系统自动分配的内存在被称为栈的内存块上[1],栈的的大小是一个编译时就确定的常数,如果申请的空间超过栈的剩余空间时,将提示溢出。因此,能从栈获得的空间较小。

如果元素数量很大,则不宜使用长度固定的数组,取而代之的可以是链表或动态分配的数组等,尤其是链表,系统将其每一个元素分配内存中任意一块可用的空间,整个链表占用的空间是非连续的,这是与数组的重要区别之处,但是链表元素不能像数组一样能随机访问,而只能顺序访问,显然效率要低。

链表结点元素空间是在被称为堆的内存块上申请的[1]。操作系统有一个记录堆上空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。动态申请的内存也是在堆上分配的。一般情况下,堆内存远比栈内存大,动态分配大块连续内存空间的成功率较高。

2 动态内存管理

运算符new/delete用于完成动态内存的申请与释放,使用中应注意以下几点:

1)动态申请不成功

以int*p=new int[n];为例,语句中动态申请有可能不成功,例如n很大而堆上空闲的连续内存空间都很小时,此时new运算返回空指针,使用时应作检查,如果为空即p==0,则不能进行后续操作。程序中做这种检查是一个好的习惯,它将消除申请不成功带来的隐患,然而c++的初学者很难做到这一点。

2)动态申请的内存未释放

当程序用new动态申请的内存不再使用时,应该使用delete释放空间,由操作系统支配使用。然而初学者发现,程序中不释放也没有问题的,程序可以正常运行,以下面的代码片段为例:

这是为什么呢?很简单,因为程序中申请的内存很少,这些内存在程序退出后没有释放,也就是没有归还操作系统,很幸运,还不影响系统使用内存资源。这些没有被释放的内存空间此时成了不可再使用的垃圾空间,直到计算机被重新启动,这种现象被形象地称为内存泄漏。然而,如果动态申请的空间很大,并多次申请时,也许就没这么幸运了。以下面的代码片段为例:

可能的结果是系统内存将被迅速用完。记住,new/delete必须配对使用,有多少次new运算,就应有多少次delete运算。如果总是申请堆内存而不释放,可用内存则会越来越少,很明显的结果是系统变慢或者申请不到新的堆内存。

3)错误释放内存

系统分配的内存由系统负责释放,不能用delete来释放,delete只能用来释放通过new动态申请的内存。

4)多次释放同一块内存

同一块内存不应多次释放。释放后的内存就归操作系统支配,例如操作系统将它分配给了另一个程序,显然在程序中再次释放这块内存是错误的。这一问题在对象的浅拷贝中也存在,后面再做分析。

5)使用多级指针和new/delete来开辟空间以存放任意规模的“数组”

仅用一次new操作可以完成一维数组的动态申请,也可以完成第二维大小固定的二维数组的申请,实际上二维或更高维数组也可以看作广义一维数组,此时数组元素就是一个一维或高维数组,也就是说一次new操作仅能完成广义一维数组的动态申请。现在要申请空间来存放矩阵AMxN,如果N是常量,则int(*p)[N]=new int[M][N];就能申请,如果M和N都是变量,则用一次new操作是无法完成的,此时可以使用二级指针即指向指针的指针[2],例如int**p;。具体使用可以参考如下代码:

矩阵的每一行存放在一个动态申请的一维数组中,这些数组的首地址存放在一个动态申请的一维指针数组中,二级指针p可以作为二维数组名来使用,但是注意,p并不表示一个二维数组,因为这些申请的内存可能不再是一整块连续的。注意new与delete的配对使用。

动态申请存放“三维数组”的空间也类似,此时可以使用三级指针,例如int***p;,“三维数组”看做一个一维数组,其每个元素就是“二维数组”,而“二维数组”的动态申请用前面的方法。

3 指针使用

指针是C++语言中重要内容,也是学习和使用的难点。下面几个问题值得注意:

1)空指针

指针变量p如果赋值为0即p=0,则p就是一个空指针,空指针不指向任何内存空间,这样不能对p做除了赋值和关系之外的所有运算。因此,指针在使用之前最好设定为空指针。前面也提到,动态申请内存操作最好也应该判断是否成功,即返回是否为空指针。

2)野指针

声明一个指针变量p如果没有初始化,p的值是多少?或者说p指向哪一块内存空间?答案是“不清楚”,如果程序员没有指定初值,则编译系统给一个默认值,这个值是随机的,即p随机地指向一块内存,此时如果通过p对内存操作,显然危险。指针参与运算前应该给它赋值,可以赋零,可以赋同类型指针,可以指向某个对象或变量,根据复制兼容规则,如果为基类指针则还可以指向派生类对象。务必记住,程序中应杜绝使用野指针。

3)静态指针指向动态变量

分析下面的代码,会有什么问题吗?

函数fun()内的指针变量p是静态的,变量x是动态的,当函数第一次调用时p指向x,fun()执行完后,x消失,那么它所占的内存也被释放,而p因为是静态的仍然保留并指向一块已经被释放的内存。下次或以后调用fun()时,x重新分配空间并再次初始化,而p不再初始化,此时p是不是仍让指向现在的x呢?不一定,以后每次调用fun()时给x分配的内存与第一次的相同是无法保证的。因此,静态指针指向动态变量会存在非法内存访问的隐患,程序中要避免这样使用。

4 浅拷贝

对象拷贝体现在两个方面,一是对象赋值中,即将一个已初始化或具有某种状态的对象A赋给另一个已初始化或具有某种状态的本类对象B,亦即B=A;二是类的拷贝构造函数中,当用一个已初始化或具有某种状态的对象A去初始化本类对象B。C++中系统默认对象赋值和默认拷贝构造函数完成的对象拷贝仅仅是对象成员间一一对应的简单复制,即浅拷贝[3]。浅拷贝对于但多数使用场合没有问题,因此可以不为类写拷贝构造函数,也可以不用重载赋值运算符“=”,但是如果类的成员中含有指针,构造函数中为其动态分配了内存时,浅拷贝可能出现问题。

假设CObject类声明如下:

则语句CObject A(10),B(A),C;C=A;都能正确执行。现为该类增加一个指针成员p,它指向一块动态申请的内存,CObject类修改如下:

则语句(1)CObject A,C;正确,(2)CObject B(A);错误,(3)C=A;错误,语句(2)(3)错误分析如下:

语句(2)中,将调用类的拷贝构造函数用对象A初始化对象B,这里的拷贝构造函数是默认的,也就是CObject(CObject&Obj){n=Obj.n;p=Obj.p;},显然对象B的成员指针指向了对象A中动态申请的内存,如图1所示。

对象B消亡时将自动调用类的析构函数,此时会释放p所指的内存空间;但对象A消亡时也自动调用类的析构函数,试图释放p所指的内存空间,这样同一块动态申请的内存空间被释放两次,当然不对。显然,如果要实现对象的完全复制,B中也应动态分配与A中分配大小的一致内存空间而B.p指向它,如图2所示,并且动态内存中的数据与A中一样,也就是要实现对象的深拷贝,这一功能显然要在类的拷贝构造函数中完成,也就是要为类编写深拷贝构造函数。对CObject类修改如下:

这样,B初始化后就与A就没什么关系了,A和B消亡时各自释放自己动态申请的空间,也就不再出错。

语句(1)的情况与语句(2)类似,C=A;的功能相当于C.n=A.n;C.p=A.p;,对象赋值后C.p指向了A中动态申请的内存,不同之处在于C中动态申请了内存而B中却没有,因为B的初始化调用的是拷贝构造函数,没有动态申请内存,C的初始化调用的是普通构造函数,动态申请了内存,图示3所示。

当对象C和A消亡时,A.p所指的内存空间试图被释放两次;另一方面,C中动态申请的内存却未能得到释放。显然,执行语句C=A;后,希望C.p指向C中动态申请的内存,如图4所示,并且动态内存中的数据与A中一样,即要实现对象的深拷贝,而C++默认的赋值运算符“=”无法做到这一点,这就要为运算符“=”进行重载。对CObject类修改如下:

对象深浅拷贝问题是让初学者最头疼的问题,最难理解,最容易出错。记住关键的一点,如果类的成员中含有指针,并要指向一块动态申请的内存,当类被使用时其拷贝构造函数会被调用,必须为类编写深拷贝构造函数;当类的对象要通过“=”相互赋值时,必须为类重载“=”运算符。

5 C++/CLR

.NET环境中支持C++/CLI(公共语言基础结构)编程,C++/CLR(公共语言运行库)是CLI的一个标准实现,它对托管的代码采取了垃圾内存自动回收机制[4],例如用gcnew动态申请的内存不再使用时,程序员不必去释放,CLR中的垃圾回收器会根据系统内存使用情况自动回收不再使用的动态申请的内存。但是注意,使用new分配的内存不托管,还是要程序员动态删除。

6 结论

通过对C++语言中的内存管理、指针和数组等方面的讨论,给出了在教学中需要注意的地方和相应的处理方法。指针是C++语言中的关键技术,因而使用C++语言编程是无法避免使用指针的,只要弄清楚其运行机制,恰当地使用指针将使C++程序变得更加简洁而高效。

参考文献

[1]李冬梅,施海虎.编译原理[M].北京:人民邮电出版社,2006.

[2]王晓东.计算机算法分析与设计[M].北京:电子工业出版社,2001.

[3]郑莉,董渊,张瑞丰.C++语言程序设计[M].3版北京:清华大学出版社,2004.

上一篇:人身伤害赔偿标准(解释全文)下一篇:单片机实训内容