常见内存错误
- 格式:docx
- 大小:29.78 KB
- 文档页数:9
电脑经常显示内存错误1 内存条坏了更换内存条2 双内存不兼容使用同品牌的内存或只要一条内存3 内存质量问题更换内存条4 散热问题加强机箱内部的散热5 内存和主板没插好或其他硬件不兼容重插内存或换个插槽6 硬件有问题更换硬盘7 驱动问题重装驱动,如果是新系统,应先安装主板驱动8 软件损坏重装软件9 软件有BUG 打补丁或更新到最新版本10 软件和系统不兼容给软件打上补丁或是试试系统的兼容模式11 软件和软件之间有冲突如果最近安装了什么新软件,卸载了试试12 软件要使用其他相关的软件有问题重装相关软件,比如播放某一格式的文件时出错,可能是这个文件的解码器有问题13 病毒问题杀毒14 杀毒软件与系统或软件相冲突由于杀毒软件是进入底层监控系统的,可能与一些软件相冲突,卸载试试15 系统本身有问题有时候操作系统本身也会有BUG,要注意安装官方发行的更新程序,象SP的补丁,最好打上.如果还不行,重装系统,或更换其他版本的系统。
另:在控制面板的添加/删除程序中看看你是否安装了微软NET.Framework,如果已经安装了,可以考虑卸载它,当然如果你以后在其它程序需要NET.Framework时候,可以再重新安装。
另外,如果你用的是ATI显卡并且你用的是SP2的补丁(一些ATI的显卡驱动需要在NET.Framework正常工作的环境下)。
这种情况你可以找一款不需要NET.Framework支持的ATI显卡驱动。
如果以上两种方法并不能完全解决问题,你试着用一下“IE修复”软件,并可以查查是否有病毒之类的。
〔微软NET.Framework升级到1.1版应该没问题了〕另:微软新闻组的朋友指点:开始--运行:regsvr32 jscript.dll开始--运行:regsvr32 vbscript.dll不过没解决---但提供了路子-----一次运行注册所有dll搜索查找到方法如下:1运行输入cmd 回车在命令提示符下输入for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1这个命令老兄你慢慢输输入正确的话会看到飞快地滚屏否则……否则失败就是没这效果。
系统内存蓝屏的错误代码大全系统内存蓝屏的错误代码大全0 0x00000000 作業完成。
1 0x00000001 不正确的函數。
2 0x00000002 系統找不到指定的檔案。
3 0x00000003 系統找不到指定的路徑。
4 0x00000004 系統無法開啓檔案。
5 0x00000005 拒絕存取。
6 0x00000006 無效的代碼。
7 0x00000007 儲存體控制區塊已毀。
8 0x00000008 儲存體空間不足,無法處理這個指令。
9 0x00000009 儲存體控制區塊地址無效。
10 0x0000000A 環境不正确。
11 0x0000000B 嘗試加載一個格式錯誤的程序。
12 0x0000000C 存取碼錯誤。
13 0x0000000D 資料錯誤。
14 0x0000000E 儲存體空間不夠,無法完成這項作業。
15 0x0000000F 系統找不到指定的磁盤驅動器。
16 0x00000010 無法移除目錄。
16 0x00000010 無法移除目錄。
17 0x00000011 系統無法将檔案移到其它的磁盤驅動器。
18 0x00000012 沒有任何檔案。
19 0x00000013 儲存媒體爲寫保護狀态。
20 0x00000014 系統找不到指定的裝置。
21 0x00000015 裝置尚未就緒。
22 0x00000016 裝置無法識别指令。
23 0x00000017 資料錯誤 (cyclic redundancy check)24 0x00000018 程序發出一個長度錯誤的指令。
25 0x00000019 磁盤驅動器在磁盤找不到持定的扇區或磁道。
26 0x0000001A 指定的磁盤或磁盤無法存取。
27 0x0000001B 磁盤驅動器找不到要求的扇區。
28 0x0000001C 打印機沒有紙。
29 0x0000001D 系統無法将資料寫入指定的磁盤驅動器。
30 0x0000001E 系統無法讀取指定的裝置。
内存常见问题总结内存是电脑中非常重要的组件之一,它负责存储和提供数据给处理器使用。
然而,由于各种原因,内存可能会出现一些常见问题。
本文将对一些常见的内存问题进行总结,并给出解决方法。
一、内存频率不匹配内存条有不同的频率,而且主板也有不同的最高频率支持。
如果安装了频率过高的内存条,可能会导致电脑无法正常工作。
在这种情况下,最好将内存频率设置为主板支持的最高频率,或者更换合适的内存条。
二、内存条无法被识别有时候,安装了新的内存条后,电脑无法识别它们。
这可能是由于内存条没有正确插入到插槽中,或者插槽上存在污垢。
此时,我们应该检查内存条是否正确插入,并用橡皮擦轻轻擦拭插槽金手指,确保插槽的良好接触。
三、内存兼容性问题有时候,即使内存条的频率和容量都是兼容的,但在某些特定的主板上还是无法正常工作。
这可能是由于主板的BIOS需要更新,以支持新的内存条。
在这种情况下,我们应该访问主板制造商的网站,下载最新的BIOS更新并安装它们。
四、内存容量不足当我们运行大型程序或者多个程序时,如果内存容量不足,电脑可能会变得非常缓慢甚至崩溃。
在这种情况下,我们可以考虑增加内存条的容量。
首先,我们需要确定主板的最大支持容量,然后购买合适容量的内存条。
五、内存闪退有时候,我们可能会遇到内存闪退的问题。
这通常是由于内存条出现故障导致的。
我们可以使用内存测试工具进行测试,如果发现有错误,就需要更换新的内存条。
六、内存过热内存条也需要散热,过热可能导致电脑性能下降甚至系统崩溃。
解决这个问题的方法有两个:一是确保内存条周围的通风良好,没有堵塞物;二是可以考虑安装散热器或者风扇来降低内存的温度。
七、内存时序设置错误内存条有不同的时序设置,如果我们在BIOS中将时序设置为错误的数值,也可能会导致系统不稳定或者出现错误。
在这种情况下,我们应该参考内存条的规格书,将时序设置为正确的数值。
八、内存松动或脱落有时候,内存条可能会因为长时间震动而松动或者失去联系。
内存错误一般有这几个问题会出现这种情况:1、内存质量不高或者接触不良或者老化。
2、硬件的驱动程序不匹配或者损坏。
3、系统遭病毒破坏某些硬件配置文件被更改。
4、有几个软件冲突。
如果是使用中出现了这种问题,并没有安装软件或驱动,要检查内存通常是由有问题的驱动程序引起的,有缺陷的内存、损坏的虚拟内存文件、某些软件比如多媒体软件、杀毒软件、备份软件、DVD播放软件等也会导致这个错误. 解决方案: 出现这个问题的原因很多,给你提供点线索,供参考。
1、将BIOS设置为默认值。
2、检查所有连接,给主机除尘。
3、检查散热。
4、测试内存是否存在问题,清理插槽,再插紧。
5、重新设置虚拟内存,将虚拟内存设置在空间比较大的C盘以外的分区中。
6、如果在上网时遇到这个蓝屏, 而你恰恰又在进行大量的数据下载和上传(比如:网络游戏、BT下载), 那么应该是网卡驱动的问题,更换网卡驱动或换个网卡。
7、检查最新安装或升级的驱动程序,如果蓝屏中出现"acpi.sys"等类似文件名, 可以非常肯定时驱动程序问题,将这个驱动卸载,重新安装适宜的驱动程序。
8、更换显卡、声卡驱动程序9、卸载、更换机子中的怀疑有问题的软件,特别是杀软件。
更换游戏软件版本。
10、也有可能是由于硬件或其驱动程序和Windows 的电源管理不兼容。
(1)在“控制面板/电源选项”中如果有APM(高级电源管理)方面的设置,关闭APM功能。
同时在“休眠”中禁用休眠功能。
(2)在BIOS中把电源管理选项“ACPI Suspend Type”设置为S1(有些机器显示为STR)或直接关闭ACPI选项。
11、重装系统。
电脑开机后出现内存错误应该如何排查和解决当我们满心欢喜地打开电脑,准备开始一天的工作或娱乐时,却被突然弹出的内存错误提示弄得心烦意乱。
别担心,这篇文章将带你深入了解电脑开机后出现内存错误的排查和解决方法,让你的电脑重新恢复正常运行。
首先,我们需要明白内存错误可能出现的几种常见形式。
有时,电脑可能会直接蓝屏,并显示一些与内存相关的错误代码;或者在系统启动过程中卡住,无法进入操作系统;还有可能在运行某些程序时频繁崩溃,提示内存不足等。
那么,当遇到这些情况时,我们该从哪里入手进行排查呢?第一步,检查硬件连接。
内存可能由于长时间使用或者搬运电脑等原因,出现松动的情况。
所以,我们可以先关机,拔掉电源插头,然后打开机箱侧板,小心地取下内存条,用干净的橡皮擦轻轻擦拭内存条的金手指部分(就是与插槽接触的金属片),去除上面可能存在的氧化层或污垢。
之后,再将内存条正确地插回插槽,确保插紧插牢。
第二步,进行内存测试。
Windows 系统自带了一个内存诊断工具,我们可以通过以下步骤来使用它:按下“Windows +R”键,输入“mdschedexe”,然后按下回车键。
在弹出的窗口中,选择“立即重新启动并检查问题(推荐)”。
系统会在重启后自动进行内存检测,这个过程可能需要一些时间,请耐心等待。
检测完成后,系统会再次自动重启,并在登录界面显示检测结果。
如果检测出内存存在问题,那么就需要考虑更换内存条了。
第三步,查看系统日志。
在 Windows 系统中,我们可以通过“事件查看器”来查看系统日志。
按下“Windows +R”键,输入“eventvwrmsc”,然后按下回车键。
在事件查看器中,依次展开“Windows 日志” “系统”,查找与内存相关的错误信息。
这些错误信息可能会为我们提供更具体的线索,帮助我们确定问题所在。
第四步,检查软件冲突。
某些软件可能会因为与系统或者其他软件不兼容,导致内存错误。
我们可以尝试在安全模式下启动电脑,看看是否还会出现内存错误。
电脑开机后出现内存错误应该如何排查和解决当我们满心欢喜地打开电脑,准备开始一天的工作或娱乐时,却突然遭遇电脑开机后出现内存错误的提示,这无疑会让人感到十分沮丧和困扰。
内存错误不仅可能导致系统运行不稳定、程序崩溃,严重时甚至可能无法正常启动系统。
那么,当遇到这种情况时,我们应该如何排查和解决呢?接下来,就让我们一起来探讨一下。
首先,我们需要了解一些可能导致内存错误的常见原因。
硬件方面,可能是内存条本身存在质量问题,比如芯片损坏、金手指氧化等;也有可能是内存条安装不当,没有插紧或者插错了插槽。
软件方面,可能是系统驱动程序不兼容、系统文件损坏、病毒感染,或者是某些应用程序对内存的不合理调用等。
当电脑开机后出现内存错误时,我们可以先从简单的方法入手进行排查。
第一步,重新启动电脑。
有时候,可能只是一次临时性的故障,通过重启电脑就能解决问题。
如果重启后仍然出现内存错误,那就需要采取进一步的措施了。
第二步,检查内存条的安装情况。
关闭电脑,拔掉电源插头,然后打开机箱。
小心地取出内存条,检查金手指是否有氧化的痕迹。
如果有,可以用橡皮擦轻轻擦拭金手指,去除氧化层。
然后将内存条重新插入插槽,确保插紧插牢,并且要注意内存条的安装方向,不要插反。
如果内存条安装没有问题,接下来我们可以尝试更换内存条的插槽。
有些主板上的内存插槽可能存在故障,更换插槽也许能解决问题。
如果以上方法都没有效果,那很可能是内存条本身出现了故障。
此时,我们可以使用内存检测工具来对内存条进行检测。
有很多免费的内存检测软件可供选择,比如 MemTest86 等。
运行这些工具,它们会对内存进行全面的检测,包括读写测试、稳定性测试等。
如果检测结果显示内存条存在故障,那就需要更换新的内存条了。
除了硬件方面的排查,软件问题也可能导致内存错误。
首先,我们可以检查系统驱动程序是否最新。
过时的驱动程序可能会与内存管理产生冲突,导致内存错误。
可以通过设备管理器或者电脑厂商的官方网站来更新驱动程序。
现场调试产品时常见的PLC内存错误及排查思路PLC(可编程逻辑控制器)在现代工业自动化中起到了至关重要的作用。
然而,在现场调试产品过程中,我们有时会遇到PLC内存错误的问题,这可能导致程序执行异常或功能失效。
因此,了解常见的PLC内存错误及相应的排查思路对于解决这些问题至关重要。
本文将介绍一些常见的PLC内存错误,并提供一些排查思路,以帮助解决类似问题。
一、内存丢失错误内存丢失是指PLC中存储的程序和数据在某种情况下被清除或丢失的问题,导致PLC无法正常执行程序。
常见的内存丢失错误可能源于以下几个方面:1. 电源故障:PLC可能由于电源故障导致内存丢失。
这可以通过检查电源电压是否稳定,电缆连接是否良好来排查。
2. 长时间停电:长时间停电可能导致PLC内部电容电压下降,进而导致内存数据丢失。
为了排查这个问题,可以检查电池电压是否正常,是否需要更换新的电池。
3. 设备故障:PLC本身的硬件故障也可能导致内存丢失。
排查时需检查PLC的各个部件是否工作正常。
二、PLC程序错误PLC程序错误可能导致内存错误,从而影响PLC的正常工作。
以下是几个常见的PLC程序错误类型及排查思路:1. 逻辑错误:逻辑错误可能导致PLC程序无法正确执行。
在排查过程中,可以逐步检查程序的每个逻辑步骤是否正确,以确保程序的准确性。
2. 存储错误:在PLC程序中,存储错误是指由于程序编写错误或操作错误而导致的数据存储问题。
排查时需仔细检查程序中的存储操作是否正确,以及数据是否被正确保存。
3. 写入错误:PLC程序中的写入错误是指在将数据写入内存时发生的错误。
排查时需要确认写入操作的地址、数据类型和数值是否正确。
三、排查思路在排查PLC内存错误时,我们可以采取以下一些排查思路:1. 检查硬件连接:首先,确保所有的硬件设备连接正确,包括电源连接、信号线连接等。
检查连接是否紧固,是否有松动或损坏的地方。
2. 检查电源稳定:PLC对于稳定的电源供应非常敏感。
内存出现异常的原因内存是电脑硬件的一部分,用来存储数据和程序运行所需的临时信息。
当内存出现异常时,电脑可能会出现各种问题,包括系统崩溃、应用程序崩溃、慢速运行等。
内存出现异常的原因有多种,下面将详细介绍几种常见的原因。
1.内存条损坏:内存条是计算机内存的主要组成部分,如果内存条损坏,就会引起内存异常。
内存条损坏的原因可能是长时间使用导致老化、频繁插拔内存条、静电击中内存条等。
当内存条损坏时,通常会导致电脑无法正常启动,出现蓝屏等问题。
2.软件冲突:有些软件可能会占用大量内存,当多个这样的软件同时运行时,就会导致内存异常。
特别是一些游戏、视频播放器等需要大量内存的应用程序,会对内存的使用产生较大影响。
此外,一些软件的设计缺陷也可能导致内存异常,如内存泄漏等。
3.病毒感染:计算机病毒是一种常见的导致内存异常的原因。
病毒可以通过修改或破坏计算机内存中的数据来影响系统的稳定性。
有些病毒会不断复制自己,并占用大量内存资源,导致其他应用程序无法正常运行。
4.运行过程中的错误:在程序编写时,可能会出现内存的错误使用。
例如,访问未初始化的内存、内存越界访问、未及时释放内存等。
这些错误会导致程序运行出现异常,进而影响整个系统的内存使用情况。
5.过度占用内存:当系统中的应用程序过多或一些应用程序占用较高内存时,就会导致内存异常。
这种情况通常发生在内存较小的计算机上,当内存不足以支持同时运行的应用程序时,就会导致内存异常。
6.系统设置错误:错误的系统设置也可能导致内存出现异常。
例如,将虚拟内存设置得过小,或者设置了错误的内存分页文件大小等。
这些错误的设置会导致系统的内存管理不当,进而导致内存异常。
7.内存扩展失败:有些用户可能会尝试通过安装额外的内存条来扩展计算机的内存容量。
然而,如果选择了不兼容的内存条,或者安装不当,就会导致内存扩展失败,进而导致内存异常。
总之,内存出现异常可能是由多种原因引起的。
为了避免内存异常,用户可以定期检查内存条的健康状况、避免过度占用内存、及时更新和扫描病毒软件、合理设置系统参数等。
电脑内存出现错误如何修复在日常使用电脑的过程中,我们经常会遇到各种问题,其中之一就是电脑内存出现错误。
电脑内存是计算机中的重要组成部分,它负责存储临时数据以及运行中的程序。
当内存出现错误时,不仅会降低电脑的性能,还可能导致系统崩溃或蓝屏等严重问题。
因此,本文将为大家介绍一些常见的电脑内存错误以及如何修复它们。
一、内存错误的表现1. 蓝屏错误蓝屏错误是内存问题的常见表现之一。
当内存出现错误或损坏时,操作系统会无法正常访问或使用内存,从而导致系统崩溃,显示蓝色的屏幕并出现错误提示。
这时候我们就需要通过修复内存错误来解决问题。
2. 程序崩溃另一种常见的内存错误表现是程序崩溃。
当内存出现错误时,正在运行的程序可能会无法访问或读取所需的内存,导致程序异常终止。
这时候我们需要定位内存错误并进行修复。
3. 电脑运行缓慢如果内存出现错误或损坏,电脑的运行速度也会受到影响。
由于内存负责存储临时数据和运行中的程序,当内存错误增多时,电脑的响应速度会变慢,启动和运行程序的时间也会延长。
因此,注意观察电脑的运行速度,及时处理内存错误。
二、修复内存错误的方法1. 清理内存在电脑运行一段时间后,内存中可能会残留大量的临时数据和垃圾文件,这些文件会占用内存空间并导致内存错误。
为了修复内存错误,我们可以使用系统自带的清理工具或第三方清理软件来清理内存,释放内存空间,提高系统的运行效率。
2. 检查硬件连接有时候内存错误可能是由于硬件连接问题引起的,这时候我们需要检查电脑内存条的插槽是否牢固连接。
可以尝试将内存条重新插拔一遍来确保其正常连接。
如果内存条有损坏或松动的情况,及时更换或修复。
3. 运行内存诊断工具为了定位和修复内存错误,我们可以使用内存诊断工具来进行检测。
Windows操作系统自带了一个内存诊断工具,可以帮助我们判断内存是否存在错误。
打开控制面板,搜索“内存诊断”,然后按照提示进行内存检测。
根据检测结果,我们可以进一步采取措施来修复内存错误。
电脑内存条故障的常见症状是什么在我们日常使用电脑的过程中,内存条作为重要的硬件组件之一,一旦出现故障,可能会给我们带来诸多困扰。
那么,如何判断电脑内存条是否出现故障呢?这就需要我们了解内存条故障的常见症状。
电脑开机无显示是内存条故障较为常见的表现之一。
当我们按下电源按钮后,电脑主机风扇在转,电源指示灯亮,但显示器却没有任何图像显示。
这时候,内存条故障就有可能是罪魁祸首。
频繁死机也是一个值得关注的症状。
电脑在运行过程中突然死机,画面定格,鼠标和键盘都没有任何反应。
这种情况可能会反复出现,严重影响我们的正常使用。
而内存条的问题,比如内存芯片质量不佳、接触不良等,都可能导致系统运行不稳定,从而引发死机现象。
系统运行速度明显变慢也是内存条故障的一种可能表现。
原本流畅运行的程序突然变得卡顿,打开文件或者切换任务需要很长时间。
这可能是因为内存条无法正常提供足够的内存空间,导致系统在处理数据时效率低下。
另外,如果电脑频繁出现蓝屏错误,并且在错误信息中提到与内存相关的内容,那很有可能是内存条出现了故障。
蓝屏错误通常会伴随着一些错误代码,比如“MEMORY_MANAGEMENT”等,这些都提示着内存方面存在问题。
电脑在启动时会发出异常的报警声,也可能暗示着内存条存在故障。
不同的主板报警声可能有所不同,但通常连续的短鸣声或者长鸣声都可能与内存有关。
还有一种情况是,电脑在安装操作系统或者运行某些软件时,出现报错提示,无法完成安装或运行。
这可能是由于内存条存在损坏或者兼容性问题,导致系统无法正常读取和写入内存中的数据。
有时候,电脑会出现随机性的重启现象。
没有任何规律,突然就自动重新启动。
这种随机性的重启,也有可能是内存条故障引起的。
如果电脑出现了上述这些症状,我们可以首先尝试重新插拔内存条,以排除接触不良的问题。
在操作时,一定要先关闭电脑电源,并拔掉电源线,然后小心地取下内存条,用干净的橡皮擦擦拭内存条的金手指部分,去除上面的氧化层,再重新插回插槽。
随着诸如代码重构和单元测试等方法引入实践,调试技能渐渐弱化了,甚至有人主张废除调试器。
这是有道理的,原因在于调试的代价往往太大了,特别是调试系统集成之后的BUG,一个BUG花了几天甚至数周时间并非罕见。
而这些难以定位的BUG基本上可以归为两类:内存错误和并发问题。
而又以内存错误最为普遍,即使是久经沙场的老手,也有时也难免落入陷阱。
前事不忘,后世之师,了解这些常见的错误,在编程时就加以注意,把出错的概率降到最低,可以节省不少时间。
这些列举一些常见的内存错误,供新手参考。
1.内存泄露。
大家都知道,在堆上分配的内存,如果不再使用了,应该把它释放掉,以便后面其它地方可以重用。
在C/C++中,内存管理器不会帮你自动回收不再使用的内存。
如果你忘了释放不再使用的内存,这些内存就不能被重用,就造成了所谓的内存泄露。
把内存泄露列为首位,倒并不是因为它有多么严重的后果,而因为它是最为常见的一类错误。
一两处内存泄露通常不至于让程序崩溃,也不会出现逻辑上的错误,加上进程退出时,系统会自动释放该进程所有相关的内存,所以内存泄露的后果相对来说还是比较温和的。
当然了,量变会产生质变,一旦内存泄露过多以致于耗尽内存,后续内存分配将会失败,程序可能因此而崩溃。
现在的PC机内存够大了,加上进程有独立的内存空间,对于一些小程序来说,内存泄露已经不是太大的威胁。
但对于大型软件,特别是长时间运行的软件,或者嵌入式系统来说,内存泄露仍然是致命的因素之一。
不管在什么情况下,采取比较谨慎的态度,杜绝内存泄露的出现,都是可取的。
相反,认为内存有的是,对内存泄露放任自流都不是负责的。
尽管一些工具可以帮助我们检查内存泄露问题,我认为还是应该在编程时就仔细一点,及早排除这类错误,工具只是用作验证的手段。
2.内存越界访问。
内存越界访问有两种:一种是读越界,即读了不属于自己的数据,如果所读的内存地址是无效的,程度立刻就崩溃了。
如果所读内存地址是有效的,在读的时候不会出问题,但由于读到的数据是随机的,它会产生不可预料的后果。
另外一种是写越界,又叫缓冲区溢出。
所写入的数据对别人来说是随机的,它也会产生不可预料的后果。
内存越界访问造成的后果非常严重,是程序稳定性的致命威胁之一。
更麻烦的是,它造成的后果是随机的,表现出来的症状和时机也是随机的,让BUG 的现象和本质看似没有什么联系,这给BUG的定位带来极大的困难。
一些工具可以够帮助检查内存越界访问的问题,但也不能太依赖于工具。
内存越界访问通常是动态出现的,即依赖于测试数据,在极端的情况下才会出现,除非精心设计测试数据,工具也无能为力。
工具本身也有一些限制,甚至在一些大型项目中,工具变得完全不可用。
比较保险的方法还是在编程是就小心,特别是对于外部传入的参数要仔细检查。
3.野指针。
野指针是指那些你已经释放掉的内存指针。
当你调用free(p)时,你真正清楚这个动作背后的内容吗?你会说p指向的内存被释放了。
没错,p本身有变化吗?答案是p本身没有变化。
它指向的内存仍然是有效的,你继续读写p 指向的内存,没有人能拦得住你。
释放掉的内存会被内存管理器重新分配,此时,野指针指向的内存已经被赋予新的意义。
对野指针指向内存的访问,无论是有意还是无意的,都为此会付出巨大代价,因为它造成的后果,如同越界访问一样是不可预料的。
释放内存后立即把对应指针置为空值,这是避免野指针常用的方法。
这个方法简单有效,只是要注意,当然指针是从函数外层传入的时,在函数内把指针置为空值,对外层的指针没有影响。
比如,你在析构函数里把this指针置为空值,没有任何效果,这时应该在函数外层把指针置为空值。
4.访问空指针。
空指针在C/C++中占有特殊的地址,通常用来判断一个指针的有效性。
空指针一般定义为0。
现代操作系统都会保留从0开始的一块内存,至于这块内存有多大,视不同的操作系统而定。
一旦程序试图访问这块内存,系统就会触发一个异常。
操作系统为什么要保留一块内存,而不是仅仅保留一个字节的内存呢?原因是:一般内存管理都是按页进行管理的,无法单纯保留一个字节,至少要保留一个页面。
保留一块内存也有额外的好处,可以检查诸如p=NULL; p[1]之类的内存错误。
在一些嵌入式系统(如arm7)中,从0开始的一块内存是用来安装中断向量的,没有MMU的保护,直接访问这块内存好像不会引发异常。
不过这块内存是代码段的,不是程序中有效的变量地址,所以用空指针来判断指针的有效性仍然可行。
在访问指针指向的内存时,在确保指针不是空指针。
访问空指针指向的内存,通常会导致程度崩溃,或者不可预料的错误。
5.引用未初始化的变量。
未初始化变量的内容是随机的(像VC一类的编译器会把它们初始化为固定值,如0xcc),使用这些数据会造成不可预料的后果,调试这样的BUG也是非常困难的。
对于态度严谨的程度员来说,防止这类BUG非常容易。
在声明变量时就对它进行初始化,是一个编程的好习惯。
另外也要重视编译器的警告信息,发现有引用未初始化的变量,立即修改过来。
6.不清楚指针运算。
对于一些新手来说,指针常常让他们犯糊涂。
比如int *p = …; p+1等于(size_t)p + 1吗老手自然清楚,新手可能就搞不清了。
事实上, p+n 等于(size_t)p + n *sizeof(*p)指针是C/C++中最有力的武器,功能非常强大,无论是变量指针还是函数指针,都应该掌握都非常熟练。
只要有不确定的地方,马上写个小程序验证一下。
对每一个细节都了然于胸,在编程时会省下不少时间。
7.结构的成员顺序变化引发的错误。
在初始化一个结构时,老手可能很少像新手那样老老实实的,一个成员一个以上这种方式是非常危险的,原因在于你对结构的内存布局作了假设。
如果这个结构是第三方提供的,他很可能调整结构中成员的相对位置。
而这样的调整往往不会在文档中说明,你自然很少去关注。
如果调整的两个成员具有相同数据类型,编译时不会有任何警告,而程序的逻辑上可能相距十万八千里了。
8.结构的大小变化引发的错误。
在OOP中,我们可以认为第二个结构继承了第一结构,这有什么问题吗?当然没有,这是C语言中实现继承的基本手法。
现在假设第一个结构是第三方提供的,第二个结构是你自己的。
第三方提供的库是以DLL方式分发的,DLL最大好处在于可以独立替换。
但随着软件的进化,问题可能就来了。
当第三方在第一个结构中增加了一个新的成员int k;,编译好后把DLL给你,你直接给了客户了。
程序加载时不会有任何问题,在运行逻辑可能完全改变!原因是两个结构的内存布局重叠了。
解决这类错误的唯一办法就是全部重新相关的代码。
解决这类错误的唯一办法就是重新编译全部代码。
由此看来,DLL并不见得可以动态替换,如果你想了解更多相关内容,建议阅读《COM本质论》。
9.分配/释放不配对。
大家都知道malloc要和free配对使用,new要和delete/delete[]配对使用,重载了类new操作,应该同时重载类的delete/delete[]操作。
这些都是书上反复强调过的,除非当时晕了头,一般不会犯这样的低级错误。
而有时候我们却被蒙在鼓里,两个代码看起来都是调用的free函数,实际上却调用了不同的实现。
比如在Win32下,调试版与发布版,单线程与多线程是不同的运行时库,不同的运行时库使用的是不同的内存管理器。
一不小心链接错了库,那你就麻烦了。
程序可能动则崩溃,原因在于在一个内存管理器中分配的内存,在另外一个内存管理器中释放时出现了问题。
10.返回指向临时变量的指针大家都知道,栈里面的变量都是临时的。
当前函数执行完成时,相关的临时变量和参数都被清除了。
不能把指向这些临时变量的指针返回给调用者,这样的指针指向的数据是随机的,会给程序造成不可预料的后果。
11.试图修改常量在函数参数前加上const修饰符,只是给编译器做类型检查用的,编译器禁止修改这样的变量。
但这并不是强制的,你完全可以用强制类型转换绕过去,一般也不会出什么错。
而全局常量和字符串,用强制类型转换绕过去,运行时仍然会出错。
原因在于它们是是放在.rodata里面的,而.rodata内存页面是不能修改的。
试图对它们修改,会引发内存错误。
12.误解传值与传引用在C/C++中,参数默认传递方式是传值的,即在参数入栈时被拷贝一份。
在函数里修改这些参数,不会影响外面的调用者。
如:在main函数里,p的值仍然是空值。
13.重名符号。
无论是函数名还是变量名,如果在不同的作用范围内重名,自然没有问题。
但如果两个符号的作用域有交集,如全局变量和局部变量,全局变量与全局变量之间,重名的现象一定要坚决避免。
gcc有一些隐式规则来决定处理同名变量的方式,编译时可能没有任何警告和错误,但结果通常并非你所期望的。
下面例子编译时就没有警告:如果把main.c中的int count;修改为int count = 0;,gcc就会编辑出错,说multiple definition of `count'。
它的隐式规则比较奇妙吧,所以还是不要依赖它为好。
14.栈溢出。
我们在前面关于堆栈的一节讲过,在PC上,普通线程的栈空间也有十几M,通常够用了,定义大一点的临时变量不会有什么问题。
而在一些嵌入式中,线程的栈空间可能只5K大小,甚至小到只有256个字节。
在这样的平台中,栈溢出是最常用的错误之一。
在编程时应该清楚自己平台的限制,避免栈溢出的可能。
15.误用sizeof。
尽管C/C++通常是按值传递参数,而数组则是例外,在传递数组参数时,数组退化为指针(即按引用传递),用sizeof是无法取得数组的大小的。
test:size=4main:size=2016.字节对齐。
字节对齐主要目的是提高内存访问的效率。
但在有的平台(如arm7)上,就不光是效率问题了,如果不对齐,得到的数据是错误的。
所幸的是,大多数情况下,编译会保证全局变量和临时变量按正确的方式对齐。
内存管理器会保证动态内存按正确的方式对齐。
要注意的是,在不同类型的变量之间转换时要小心,如把char*强制转换为int*时,要格外小心。
另外,字节对齐也会造成结构大小的变化,在程序内部用sizeof来取得结构的大小,这就足够了。
若数据要在不同的机器间传递时,在通信协议中要规定对齐的方式,避免对齐方式不一致引发的问题。
17.字节顺序。
字节顺序历来是设计跨平台软件时头疼的问题。
字节顺序是关于数据在物理内存中的布局的问题,最常见的字节顺序有两种:大端模式与小端模式。
大端模式是高位字节数据存放在低地址处,低位字节数据存放在高地址处。
小端模式指低位字节数据存放在内存低地址处,高位字节数据存放在内存高地址处;比如long n = 0x11223344。
在普通软件中,字节顺序问题并不引人注目。