編程規(guī)范和技巧——編寫(xiě)高質(zhì)量的CC++程序_第1頁(yè)
編程規(guī)范和技巧——編寫(xiě)高質(zhì)量的CC++程序_第2頁(yè)
編程規(guī)范和技巧——編寫(xiě)高質(zhì)量的CC++程序_第3頁(yè)
編程規(guī)范和技巧——編寫(xiě)高質(zhì)量的CC++程序_第4頁(yè)
編程規(guī)范和技巧——編寫(xiě)高質(zhì)量的CC++程序_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、編程規(guī)范和技巧 編寫(xiě)高質(zhì)量的C/C+程序一定要編寫(xiě)高質(zhì)量代碼!高質(zhì)量代碼提高編程效率減少調(diào)試時(shí)間提高人品:代碼是寫(xiě)給他人用的!養(yǎng)成好習(xí)慣從點(diǎn)點(diǎn)滴滴做起不要光看不做程序員的境界大學(xué)計(jì)算機(jī)教育的失誤:程序質(zhì)量低下什么是編程老手:能夠長(zhǎng)期穩(wěn)定地編寫(xiě)出高質(zhì)量程序的程序員什么是編程高手:能夠長(zhǎng)期穩(wěn)定地編寫(xiě)出高難度、高質(zhì)量程序的程序員編程風(fēng)格世上不存在最好的編程風(fēng)格一切因需求而定團(tuán)隊(duì)開(kāi)發(fā)講究風(fēng)格一致如果制定了大家認(rèn)可的編程風(fēng)格,那么所有組員都要遵守若某種編程風(fēng)格比較合你的工作,那么就采用它,不要只看不做:養(yǎng)成習(xí)慣!一流代碼的特性魯棒 - Solid and Robust Code簡(jiǎn)潔 - Maintain

2、able and Simple Code高效 - Fast Code簡(jiǎn)短 - Small Code共享 - Re-usable Code可測(cè)試 - Testable Code可移植 - Portable Code一流代碼關(guān)于代碼風(fēng)格問(wèn)題代碼風(fēng)格(Coding Style)是一種習(xí)慣現(xiàn)在許多大公司都對(duì)員工書(shū)寫(xiě)代碼制定了規(guī)范開(kāi)發(fā)大項(xiàng)目時(shí)由項(xiàng)目管理者制定代碼規(guī)范程序風(fēng)格的重要構(gòu)成因素程序版式命名規(guī)則函數(shù)設(shè)計(jì)原則其他表達(dá)式規(guī)則與零比較常量規(guī)則動(dòng)態(tài)數(shù)組內(nèi)存管理程序版式程序版式程序員的書(shū)法比書(shū)法好學(xué)得多,基本不需要特別練習(xí)但是壞習(xí)慣一旦養(yǎng)成,就像書(shū)法一樣難以改變不影響程序的功能,但影響程序的可讀性追求清晰

3、、整潔、美觀、一目了然容易閱讀,容易測(cè)試程序版式不良的風(fēng)格int isprime(int n)int k,i;if (n = 1) return 0;k=sqrt(double)n); for (i=2;i=k;i+)if(n%i=0) return 0;return 1;#include #include main()int i;for (i=2;i100;i+)if(isprime(i)printf(%dt,i); 程序版式良好的風(fēng)格int isprime(int n) int k, i; if (n = 1) return 0; k = (int)sqrt(double)n); for

4、(i=2; i=k; i+) if (n % i = 0) return 0; return 1;#include #include main() int i; for (i=2; i 前后不加空格對(duì)表達(dá)式較長(zhǎng)的for和if語(yǔ)句,為了緊湊可在適當(dāng)?shù)胤饺サ粢恍┛崭駀or (i=0; ic) & (b+ca) & (c+ab)void Func1(int x, int y, int z); / 良好的風(fēng)格void Func1 (int x,int y,int z); / 不良的風(fēng)格printf(%d%d%d, a, b, c); / 良好的風(fēng)格printf(%d%d%d,a,b,c); / 不良的

5、風(fēng)格if (year = 2000) / 良好的風(fēng)格if(year=2000) / 不良的風(fēng)格if (a=b) & (c=b&c=d) / 不良的風(fēng)格for (i=0; i10; i+) / 良好的風(fēng)格for(i=0;i10;i+) / 不良的風(fēng)格for (i = 0; i 10; i +) / 過(guò)多的空格x = a b ? a : b; / 良好的風(fēng)格x=aFunction(); / 不要寫(xiě)成 b - Function();程序版式程序版式代碼行一行只寫(xiě)一條語(yǔ)句,這樣方便測(cè)試一行只寫(xiě)一個(gè)變量,這樣方便寫(xiě)注釋int width; /寬度int height; /高度int depth; /深度

6、盡可能在定義變量的同時(shí),初始化該變量int sum = 0;if、for、while、do等語(yǔ)句各占一行,執(zhí)行語(yǔ)句無(wú)論有幾條都用和將其包含在內(nèi),這樣便于維護(hù)if (width height) DoSomething();/空行OtherThing();int width;/ 寬度int height;/ 高度int depth;/ 深度int width, height, depth; /寬度高度深度x = a + b;y = c + d;z = e + f;x = a + b; y = c + d; z = e + f;if (width height) dosomething();if (

7、width = veryLongVar2) &(veryLongVar3 = veryLongVar4) DoSomething();double FunctionName(double variablename1, double variablename2);for (very_longer_initialization; very_longer_condition; very_longer_update) DoSomething(); 程序版式修飾符*和&的位置有爭(zhēng)議從語(yǔ)義上講,靠近數(shù)據(jù)類型更直觀,但對(duì)多個(gè)變量聲明時(shí)容易引起誤解int* x, y;提倡靠近變量名int *x, y;注釋規(guī)范

8、注釋(Comments)的重要性寫(xiě)注釋給誰(shuí)看?在哪些地方寫(xiě)注釋?怎樣寫(xiě)注釋?注釋的風(fēng)格寫(xiě)注釋時(shí)的注意事項(xiàng)可靈活運(yùn)用的一些規(guī)則注釋規(guī)范注釋的重要性注釋對(duì)于程序猶如眼睛對(duì)于人的重要性一樣沒(méi)有注釋的程序?qū)τ谧x者好比眼前一團(tuán)漆黑,跟拿到一個(gè)可執(zhí)行程序別無(wú)二致不規(guī)范的注釋和好幾千度的近視眼沒(méi)什么區(qū)別代碼本身體現(xiàn)不出價(jià)值開(kāi)發(fā)程序的思維才能使其變得有價(jià)值這種思維的具體體現(xiàn)就是在于注釋和規(guī)范的代碼本身注釋規(guī)范寫(xiě)注釋給誰(shuí)看?給自己看,使自己的設(shè)計(jì)思路得以連貫給繼任者看,使其能夠接替自己的工作注釋規(guī)范寫(xiě)注釋的最重要的功效在于傳承要站在繼任者的角度寫(xiě)簡(jiǎn)單明了、準(zhǔn)確易懂、防止二義性讓繼任者可以輕松閱讀、復(fù)用、修改自己

9、的代碼讓繼任者輕松辨別出哪些使自己寫(xiě)的,哪些是別人寫(xiě)的注釋規(guī)范不好的注釋i = i + 1; /i加1return -1; /返回-1free(p); /釋放p所指的內(nèi)存fclose(fin); /關(guān)閉文件/*/*功能描述: 本函數(shù)用于實(shí)現(xiàn)xxx功能,目的是: */ /*入口參數(shù): 參數(shù)p,表示指向結(jié)構(gòu)體的指針 */ /*出口參數(shù): 參數(shù)xx,表示 */ /*返回值: 返回xx值,當(dāng)返回xx值時(shí),表示 */*/注釋規(guī)范不好的注釋不但白寫(xiě),還擾亂了讀者的視線/*以二進(jìn)制只讀方式打開(kāi)文件并判斷打開(kāi)是否成功*/if (fin = fopen(cat.pic,rb) = NULL) puts(打開(kāi)文件

10、cat.pic失敗);/*如果打開(kāi)失敗,則顯示錯(cuò)誤信息*/ return -1; /*返回-1*/*從圖像的第1行到第400行循環(huán)*/for (i=0; i400; i+) /*從圖像的第1列到第400列循環(huán)*/ for (j=0; j400; j+) /*按照公式Y(jié) = 0.299*R+0.587*G+0.114*B計(jì)算灰度值*/ y = (299 * r + 587 * g + 114 * b) / 1000; fclose(fin); /*關(guān)閉文件*/注釋規(guī)范好的注釋(尤其是算法注釋)是對(duì)設(shè)計(jì)思想的精確表述和清晰展現(xiàn),能揭示代碼背后隱藏的重要信息/*打開(kāi)輸入文件后判斷文件長(zhǎng)度是否符合格式

11、要求*/if (fin = fopen(cat.pic,rb) = NULL) puts(打開(kāi)文件cat.pic失敗); return -1; /* * 下面是圖像轉(zhuǎn)換的算法實(shí)現(xiàn)。彩色圖像到灰度圖像的轉(zhuǎn)換主要利用RGB顏色空間到 * YUV顏色空間的變換公式來(lái)取得灰度值,公式為Y = 0.299*R+0.587*G+0.114*B */for (i=0; i400; i+) for (j=0; j400; j+) y = (299 * r + 587 * g + 114 * b) / 1000; fclose(fin); 注釋規(guī)范在哪些地方寫(xiě)注釋?在重要的文件首部文件名 + 功能說(shuō)明 + 作者

12、 + 版本 + 版權(quán)聲明 + 日期在用戶自定義函數(shù)前對(duì)函數(shù)接口進(jìn)行說(shuō)明函數(shù)功能 + 入口參數(shù) +出口參數(shù) + 返回值 (包括出錯(cuò)處理)在一些重要的語(yǔ)句塊上方對(duì)代碼的功能、原理進(jìn)行解釋說(shuō)明在一些重要的語(yǔ)句行右方定義一些非通用的變量函數(shù)調(diào)用較長(zhǎng)的、多重嵌套的語(yǔ)句塊結(jié)束處在修改的代碼行旁邊加注釋注釋規(guī)范函數(shù)的注釋風(fēng)格C風(fēng)格/*/*功能描述: 本函數(shù)用于實(shí)現(xiàn)xxx功能,目的是: */ /*入口參數(shù): 參數(shù)xx,表示 */ /*出口參數(shù): 參數(shù)xx,表示 */ /*返回值: 返回xx值,當(dāng)返回xx值時(shí),表示 */*/* 功能描述: 本函數(shù)用于實(shí)現(xiàn)xxx功能,目的是: 入口參數(shù): 參數(shù)xx,表示 出口參數(shù)

13、: 參數(shù)xx,表示 返回值: 返回xx值,當(dāng)返回xx值時(shí),表示 */C+風(fēng)格/功能描述: 本函數(shù)用于實(shí)現(xiàn)xxx功能,目的是: /入口參數(shù): 參數(shù)xx,表示 /出口參數(shù): 參數(shù)xx,表示 /返回值: 返回xx值,當(dāng)返回xx值時(shí),表示 /注釋規(guī)范一塊語(yǔ)句的注釋風(fēng)格/* *C風(fēng)格 */C風(fēng)格 /*/*下面代碼是用來(lái)接收網(wǎng)絡(luò)數(shù)據(jù),其原理為*/* */*/ Visual C+風(fēng)格 /注釋規(guī)范一行語(yǔ)句的注釋風(fēng)格/*C風(fēng)格*/Visual C+風(fēng)格i = j + 1;/代碼行右方的注釋/代碼行之上的注釋i = j + 1;例子ResetSrollInfo(g_hwndThumb);/初始化滾動(dòng)條位置for循

14、環(huán)while循環(huán) if() /if結(jié)束/while結(jié)束/for結(jié)束注釋規(guī)范寫(xiě)注釋時(shí)的注意事項(xiàng)注釋不是白話文翻譯,不要鸚鵡學(xué)舌注釋不是教科書(shū),不要把別人當(dāng)成初學(xué)者注釋不是標(biāo)準(zhǔn)庫(kù)函數(shù)參考手冊(cè)注釋不是越多越好,不好的注釋等于垃圾不寫(xiě)做了什么,寫(xiě)想做什么邊寫(xiě)代碼邊注釋修改代碼同時(shí)修改注釋注釋規(guī)范可靈活運(yùn)用的一些規(guī)則注釋可長(zhǎng)可短,但應(yīng)畫(huà)龍點(diǎn)睛,重點(diǎn)加在語(yǔ)義轉(zhuǎn)折處簡(jiǎn)單的函數(shù)可以用一句話簡(jiǎn)單說(shuō)明/兩數(shù)交換void Swap(int *x, int *y)內(nèi)部使用的函數(shù)可以簡(jiǎn)單注釋,供別人使用的函數(shù)必須嚴(yán)格注釋,特別是入口參數(shù)和出口參數(shù)Readme的書(shū)寫(xiě)內(nèi)容主要用來(lái)記錄日期、創(chuàng)建者、內(nèi)容等每次重大功能的添加、

15、修改具體格式:日期TAB創(chuàng)建者TAB內(nèi)容日期:2003.1.21創(chuàng)建者:XXX內(nèi)容:實(shí)例工程日期TAB修改的文件名TAB修改的功能對(duì)修改后的功能和原理的說(shuō)明日期TAB修改的文件名TAB修改的功能對(duì)修改后的功能和原理的說(shuō)明類的版式“以數(shù)據(jù)為中心”的版式private類型的數(shù)據(jù)寫(xiě)在前面,public類型的數(shù)據(jù)寫(xiě)在后面關(guān)注類的內(nèi)部結(jié)構(gòu)“以行為為中心”的版式public類型的數(shù)據(jù)寫(xiě)在前面, private類型的數(shù)據(jù)寫(xiě)在后面關(guān)注的是類應(yīng)該提供什么樣的接口(或服務(wù))提倡后者因?yàn)橛脩糇铌P(guān)心的是接口標(biāo)識(shí)符命名規(guī)則按照?qǐng)?zhí)行級(jí)別分為:共性規(guī)則必須執(zhí)行簡(jiǎn)化規(guī)則建議采用可選規(guī)則靈活運(yùn)用標(biāo)識(shí)符命名的共性規(guī)則直觀可以拼讀

16、,見(jiàn)名知意,不必解碼最好采用英文單詞或其組合,切忌用漢語(yǔ)拼音盡量避免出現(xiàn)數(shù)字編號(hào)不要出現(xiàn)僅靠大小寫(xiě)區(qū)分的相似的標(biāo)識(shí)符不要出現(xiàn)名字完全相同的局部變量和全局變量用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)int minValue;int maxValue;int GetValue();int SetValue();標(biāo)識(shí)符命名的共性規(guī)則盡量與所采用的操作系統(tǒng)或開(kāi)發(fā)工具的風(fēng)格保持一致在Linux/Unix平臺(tái)習(xí)慣用“小寫(xiě)加下劃線”function_name variable_NameWindows風(fēng)格大小寫(xiě)混排的單詞組合而成 FunctionName variableNameWindows應(yīng)

17、用程序命名規(guī)則Microsoft公司的Hungarian Notation主要思想在變量和函數(shù)名前加上前綴,用于標(biāo)識(shí)變量的數(shù)據(jù)類型限定范圍的前綴 + 數(shù)據(jù)類型前綴 + 有意義的英文單詞限定范圍的前綴靜態(tài)變量前加前綴s_ ,表示static全局變量前加前綴g_ ,表示global類內(nèi)的成員函數(shù)m_默認(rèn)情況為局部變量數(shù)據(jù)類型前綴ch 字符變量前綴i 整型變量前綴f 實(shí)型變量前綴p 指針變量前綴Windows應(yīng)用程序命名規(guī)則缺點(diǎn)煩瑣例如int i, j, k; float x, y, z;若采用匈牙利命名規(guī)則,則應(yīng)寫(xiě)成int iI, iJ, ik; /前綴i表示int類型float fX, fY,

18、fZ; /前綴f表示float類型簡(jiǎn)化的Windows應(yīng)用程序命名規(guī)則變量名形式小寫(xiě)字母開(kāi)頭“名詞”或者“形容詞+名詞”如oldValue, newValue等函數(shù)名形式大寫(xiě)字母開(kāi)頭“動(dòng)詞”或者“動(dòng)詞+名詞”(動(dòng)賓詞組)如GetValue(), SetValue()等 宏和const常量全用大寫(xiě)字母,并用下劃線分割單詞#define ARRAY_LEN 10const int MAX_LEN = 100;靈活運(yùn)用的命名規(guī)則限定范圍的前綴與數(shù)據(jù)類型前綴可要可不要無(wú)特殊意義的循環(huán)變量可以直接定義成i,j,k等單字母變量表達(dá)式規(guī)則盡量簡(jiǎn)單,不要太復(fù)雜不要多用途a = i+ + i+ + i+;pri

19、ntf(%d, %d, %d, i+, i+, i+);不要與數(shù)學(xué)表達(dá)式混淆if (abc) 不表示 if (ab)&(b= -EPS) & (x = EPS)if (fabs(x) = EPS)與零比較的規(guī)則指針變量與零比較不應(yīng)寫(xiě)成if (p = 0) /容易誤解為整型變量if (p != 0)if (p) /容易誤解為布爾變量if (!p)應(yīng)寫(xiě)成if (p = NULL) /強(qiáng)調(diào)p是指針變量if (p != NULL)常量規(guī)則盡量使用含義直觀的常量來(lái)表示多次出現(xiàn)的數(shù)字或者字符串#define PI 3.14159const float PI=3.14159;C+中用const常量完全取代宏

20、常量需要對(duì)外公開(kāi)的常量集中放在一個(gè)公共的頭文件中,不需要對(duì)外公開(kāi)的常量放在定義文件的頭部常量規(guī)則怎樣建立在類中恒定,且僅在類中有效的常量?#define定義的宏常量是全局的const數(shù)據(jù)成員可以嗎?常量規(guī)則class A const int SIZE = 100;/不能在類聲明中初始化const數(shù)據(jù)成員 int arraySIZE; /類的對(duì)象未被創(chuàng)建時(shí),SIZE值未知;const數(shù)據(jù)成員只能在類構(gòu)造函數(shù)的初始化表中進(jìn)行class A A(int size); /構(gòu)造函數(shù) const int SIZE;A:A(int size) : SIZE(size)A a(100); /對(duì)象a的SIZE值

21、為100A b(200); /對(duì)象b的SIZE值為200常量規(guī)則怎樣建立在整個(gè)類中都恒定的常量呢?const數(shù)據(jù)成員只在某個(gè)對(duì)象生存期內(nèi)是常量,而對(duì)類而言是可變的因?yàn)轭惪梢詣?chuàng)建多個(gè)對(duì)象不同對(duì)象的const數(shù)據(jù)成員值不同 不能指望const數(shù)據(jù)成員了常量規(guī)則怎樣建立在整個(gè)類中都恒定的常量呢?應(yīng)該用類中的枚舉常量來(lái)實(shí)現(xiàn) class A enum SIZE1 = 100, SIZE2 = 200; /枚舉常量 int arrayASIZE1; int arrayBSIZE2;缺點(diǎn):隱含數(shù)據(jù)類型是整數(shù),其最大值有限,且不能表示浮點(diǎn)數(shù) 動(dòng)態(tài)數(shù)組一維動(dòng)態(tài)數(shù)組 int *p = NULL;p = (int

22、*) malloc(n * sizeof (int); pi /像使用一維數(shù)組一樣使用二維動(dòng)態(tài)數(shù)組int *p = NULL;p = (int *) calloc(m * n, sizeof (int);pi*n+j); /像使用一維數(shù)組一樣使用函數(shù)設(shè)計(jì)原則函數(shù)的功能要單一,不要設(shè)計(jì)多用途的函數(shù) 函數(shù)的規(guī)模要小,盡量控制在50行代碼以內(nèi)1986年IBM在OS/360的研究結(jié)果:大多數(shù)有錯(cuò)誤的函數(shù)都大于500行1991年對(duì)148,000行代碼的研究表明:小于143行的函數(shù)比更長(zhǎng)的函數(shù)更容易維護(hù)函數(shù)設(shè)計(jì)原則參數(shù)的規(guī)則參數(shù)要書(shū)寫(xiě)完整,不要省略參數(shù)類型和參數(shù)名沒(méi)有參數(shù)時(shí),用void填充參數(shù)個(gè)數(shù)盡量控制

23、在5個(gè)以內(nèi)參數(shù)名要恰當(dāng),順序要合理void MyStrcpy(char *str1, char *str2);void MyStrcpy(char *dstStr, char *srcStr);如果參數(shù)是指針,且僅作輸入用,則應(yīng)在類型前加constvoid MyStrcpy(char *dstStr, const char *srcStr);函數(shù)設(shè)計(jì)原則返回值的規(guī)則不要省略返回值的類型,可聲明為void確保返回值與聲明的類型一致,不要依賴自動(dòng)類型轉(zhuǎn)換不能返回指向棧內(nèi)存的指針?lè)噶酸尫艃?nèi)存以后還繼續(xù)使用的錯(cuò)誤函數(shù)設(shè)計(jì)原則函數(shù)內(nèi)部實(shí)現(xiàn)的規(guī)則在函數(shù)的入口處,使用斷言assert檢查參數(shù)的合法性盡量少用

24、全局變量,確保函數(shù)的單入口和單出口,不得不用時(shí),要嚴(yán)格控制對(duì)它的改寫(xiě),例如,幾個(gè)有關(guān)聯(lián)的函數(shù)需要使用全局變量時(shí)全局變量應(yīng)和訪問(wèn)全局變量的函數(shù)放在單獨(dú)的一個(gè)文件中,與其它文件分別編譯并且將該全局變量聲明為static(靜態(tài)全局變量) 盡量少用靜態(tài)局部變量,以避免使函數(shù)具有“記憶”功能 成對(duì)編碼寫(xiě)函數(shù)體時(shí)先寫(xiě)上面的大括號(hào)然后馬上就寫(xiě)下面的大括號(hào)最后再插入函數(shù)體內(nèi)的代碼動(dòng)態(tài)申請(qǐng)內(nèi)存時(shí)先分配一塊內(nèi)存然后馬上就寫(xiě)釋放這塊內(nèi)存的代碼最后再在中間插入你要用這塊內(nèi)存做什么的代碼所有變量要集中申請(qǐng)?jiān)诤瘮?shù)的首部或塊的首部按以上方法編程不僅能保證快速正確,而且不必等代碼全部寫(xiě)完就可以調(diào)試其他不要過(guò)多假設(shè)不可能發(fā)生的

25、情況總是會(huì)發(fā)生充分測(cè)試構(gòu)造盡可能多的數(shù)據(jù),變態(tài)的數(shù)據(jù)Code review讓別人看你的代碼多看別人(高手)的代碼處理錯(cuò)誤機(jī)制返回錯(cuò)誤信息異常處理活用斷言ASSERT(),在debug版本多用,能發(fā)現(xiàn)很多隱含的bugs內(nèi)存管理5.1 內(nèi)存分配方式從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static變量。 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但是分配的內(nèi)存容量有限。 從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用ma

26、lloc或new申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free或delete釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由我們決定,使用非常靈活,但問(wèn)題也最多。5.2 常見(jiàn)的內(nèi)存錯(cuò)誤內(nèi)存分配未成功,卻使用了它。 內(nèi)存分配雖然成功,但是尚未初始化就引用它。 內(nèi)存分配成功并且已經(jīng)初始化,但操作越過(guò)了內(nèi)存的邊界。 忘記了釋放內(nèi)存,造成內(nèi)存泄漏。 釋放了內(nèi)存卻繼續(xù)使用它 5.3 習(xí)慣規(guī)則用malloc或new申請(qǐng)內(nèi)存之后,應(yīng)該立即檢查指針值是否為NULL。防止使用指針值為NULL的內(nèi)存。 不要忘記為數(shù)組和動(dòng)態(tài)內(nèi)存賦初值。防止將未被初始化的內(nèi)存作為右值使用。避免數(shù)組或指針的下標(biāo)越界,特別要當(dāng)心發(fā)生“多1”或者“少1”

27、操作。 動(dòng)態(tài)內(nèi)存的申請(qǐng)與釋放必須配對(duì),防止內(nèi)存泄漏。 用free或delete釋放了內(nèi)存之后,立即將指針設(shè)置為NULL,防止產(chǎn)生“野指針”。 5.4 free 和 delete 的操作它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒(méi)有把指針本身干掉。 指針p被free以后其地址仍然不變(非NULL),只是該地址對(duì)應(yīng)的內(nèi)存是垃圾,p成了“野指針”。如果此時(shí)不把p設(shè)置為NULL,會(huì)讓人誤以為p是個(gè)合法的指針。 如果程序比較長(zhǎng),我們有時(shí)記不住p所指的內(nèi)存是否已經(jīng)被釋放,在繼續(xù)使用p之前,通常會(huì)用語(yǔ)句if (p != NULL)進(jìn)行防錯(cuò)處理。很遺憾,此時(shí)if語(yǔ)句起不到防錯(cuò)作用,因?yàn)榧幢鉷不是NULL指針,它也不指向合法的內(nèi)存塊。 “野指針”示例5.5 動(dòng)態(tài)內(nèi)存會(huì)被自動(dòng)釋放嗎?指針消亡了,并不表示它所指的內(nèi)存會(huì)被自動(dòng)釋放。 內(nèi)存被釋放了,并不表示指針會(huì)消亡或者成了NULL指針。5.6 杜絕野指針“野指針”不是NULL指針,是指向“垃圾”內(nèi)存的指針。人們一般不會(huì)錯(cuò)用NULL指針,因?yàn)橛胕f語(yǔ)句很容易判斷。但是“野指針”是很危險(xiǎn)的,if語(yǔ)句對(duì)它不起作用。 “野指針”的成因主要有三種: 指針變量沒(méi)有被初始化。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的默認(rèn)值是隨機(jī)的,它會(huì)亂

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論