在我們隨手編制的VC程序中,普遍存在著會(huì)發(fā)生內(nèi)存泄漏的隱患,有些問(wèn)題程序的痼疾癥狀是在處理數(shù)據(jù)量激增時(shí)陷入癱瘓,更糟的要發(fā)現(xiàn)內(nèi)存泄漏并不容易。首先,我們要明確VC中內(nèi)存泄漏的含義:簡(jiǎn)單說(shuō)就是一個(gè)程序申請(qǐng)得到了一段內(nèi)存卻沒(méi)有及時(shí)釋放。比如用new在堆中分配了一個(gè)對(duì)象或?qū)ο蠼M卻并沒(méi)有調(diào)用delete操作。靈活的指針技術(shù)使內(nèi)存泄漏的原因變得復(fù)雜化,比如改變了保存在一變量中的指針的值后未能刪除指針?biāo)赶虻膬?nèi)存區(qū);當(dāng)內(nèi)存泄漏是來(lái)自一個(gè)帶有指針類(lèi)型成員變量的類(lèi)時(shí)會(huì)更加困難,因?yàn)楫?dāng)調(diào)用分配指針時(shí)并沒(méi)有復(fù)制構(gòu)造函數(shù)/析構(gòu)函數(shù)或運(yùn)算符。
為了防止發(fā)生內(nèi)存泄漏這樣棘手的故障,在VC編程時(shí)應(yīng)當(dāng)注意遵循幾個(gè)規(guī)范:其一,如果一個(gè)類(lèi)包含有指針并且分配了指針值,那么就需要構(gòu)造相應(yīng)的析構(gòu)函數(shù)以刪除該指針;其二,如果一個(gè)函數(shù)分配了一塊內(nèi)存并把該內(nèi)存塊返回給調(diào)用它的函數(shù)使用,那么它返回的必須是一個(gè)指針而非一個(gè)引用,因?yàn)橐貌荒鼙怀绦騽h除;其三,即使一個(gè)函數(shù)分配了一段內(nèi)存并在同一函數(shù)的稍后部分刪除了該內(nèi)存段,也要盡可能將內(nèi)存塊分配到堆棧中;最后,就是決不要試圖改變一個(gè)指針值,除非已經(jīng)刪除指針?biāo)傅膶?duì)象或通過(guò)數(shù)組指向了該指針?biāo)赶虻膬?nèi)存,而且也不要對(duì)new返回的指針進(jìn)行加1運(yùn)算。
每當(dāng)編寫(xiě)VC程序時(shí),我們都會(huì)處于一個(gè)琳瑯滿目的集成開(kāi)發(fā)環(huán)境(IDE)中,現(xiàn)實(shí)的真相是我們很多人在這里編程多年,對(duì)開(kāi)發(fā)環(huán)境了解并不全面和細(xì)微。記得王朔的小說(shuō)中有句話說(shuō)"穿了多年的外套在不穿時(shí)才發(fā)現(xiàn)它原來(lái)還有一個(gè)兜!"。我們?cè)诎惭bVC時(shí),得到的IDE即Developer Studio, VC其實(shí)是Developer Studio下激活的一個(gè)組件而已,比如微軟的VJ++也是基于Developer Studio。很少有技術(shù)書(shū)籍會(huì)一一介紹Developer Studio界面元素,也許聰明的程序員輕易就能識(shí)別其含義,全部猜對(duì)界面圖符的含義并非易事??墒撬鼈儗?duì)我們了解開(kāi)發(fā)信息很重要,也與調(diào)試程序有關(guān)聯(lián)。
在Developer Studio下會(huì)生成多個(gè)文件去保存項(xiàng)目的所有信息:一個(gè)是以.DSW為擴(kuò)展名的項(xiàng)目工作區(qū)文件,它包含項(xiàng)目中所有文件的名稱(chēng)、文件所在目錄、編譯器和連接器的選項(xiàng)以及項(xiàng)目工作的其它信息;以.DSP為擴(kuò)展名的也是項(xiàng)目記錄文件,.OPT是工作區(qū)選項(xiàng)文件,它包含Developer Studio的所有個(gè)人設(shè)置 - 包括顏色、字體、工具欄、哪個(gè)文件被打開(kāi)以及MDI窗口如何被定位和最新調(diào)試中的斷點(diǎn)等。在打開(kāi)項(xiàng)目工作區(qū)文件時(shí)其它文件隨即會(huì)自動(dòng)打開(kāi)。在Developer Studio下可以按類(lèi)查看代碼,其中的ClassView顯示了應(yīng)用程序中所有的類(lèi),每個(gè)類(lèi)下顯示了成員函數(shù)和數(shù)據(jù)成員,在成員函數(shù)旁有粉紅圖標(biāo),數(shù)據(jù)成員旁是藍(lán)綠色圖標(biāo),保護(hù)類(lèi)成員的圖標(biāo)旁有一枚鑰匙,私有類(lèi)成員則有一個(gè)掛鎖圖標(biāo)。
當(dāng)然,在開(kāi)發(fā)環(huán)境下最主要的工作是輸入編輯程序源代碼,源代碼會(huì)顯示"語(yǔ)法著色"。在缺省情況下,代碼為黑色,夾以綠色的注釋和藍(lán)色的關(guān)鍵字(指VC所保留的public、private、new和int等等)。--這些地球人都知道,但是為了調(diào)試需要,我們還可以指定顏色去顯示字符串、數(shù)字和運(yùn)算符。定義方法是通過(guò)Tools菜單下的Options對(duì)話框中的Format選項(xiàng)卡設(shè)置。
在Developer Studio提供的諸多菜單項(xiàng)中,我們往往對(duì)少數(shù)菜單避而不用,因?yàn)椴涣私馑鼈兊淖饔梦趾闷嫘臅?huì)造成亂子;還有多個(gè)菜單項(xiàng)都可以達(dá)到目的,至于它們之間的微小差別則不甚了了。比如在編譯和調(diào)試時(shí)常用到Build菜單組,它具有和應(yīng)用程序編譯、運(yùn)行調(diào)試相關(guān)的多項(xiàng)操作:其中的Compile菜單會(huì)編譯當(dāng)前的聚焦文件;Build菜單會(huì)編譯和鏈接所有在項(xiàng)目中修改的文件;Build All會(huì)編譯鏈接項(xiàng)目中所有文件,包括最近編譯后沒(méi)有修改過(guò)的文件;Batch Build用于包含有Debug和Release配置的項(xiàng)目;Clean會(huì)刪除所有的中間和輸出文件,因而項(xiàng)目目錄下僅包含源文件;Debugger Remote Connection用于遠(yuǎn)程調(diào)試,即在一臺(tái)機(jī)器運(yùn)行程序而在另一臺(tái)調(diào)試;Set Active Configuration可設(shè)置某個(gè)配置為激活狀態(tài)(Debug或Release);Profiler能夠識(shí)別應(yīng)用程序的瓶頸,即找到降低程序執(zhí)行速度的代碼和有關(guān)模塊,為此需要在"工程/設(shè)置/Link"下勾選Profiling。
VC中的警告信息是有級(jí)別的。在"工程/設(shè)置"下的"C/C++"選項(xiàng)卡中的警告級(jí)別Warning Level缺省值是3,如果改為更為嚴(yán)格的4級(jí),往往會(huì)產(chǎn)生更多的警告類(lèi)錯(cuò)誤。在C/C++選項(xiàng)卡中還提供了代碼優(yōu)化欄Optimizations,在你完成漫漫調(diào)試之旅準(zhǔn)備正式發(fā)布前夕,你應(yīng)當(dāng)改動(dòng)此項(xiàng),它提供了一些適合建立發(fā)行版應(yīng)用程序的優(yōu)化設(shè)置。
其實(shí),在多年以前,在軟件業(yè)中針對(duì)開(kāi)發(fā)具有一定規(guī)模軟件項(xiàng)目的情況就出現(xiàn)了軟件工程理論,以此來(lái)指導(dǎo)軟件人員樹(shù)立團(tuán)隊(duì)協(xié)作意識(shí),進(jìn)而保證軟件項(xiàng)目的協(xié)調(diào)性及進(jìn)度質(zhì)量等。筆者在從事VC開(kāi)發(fā)中對(duì)此很有感觸,而且覺(jué)得對(duì)于每個(gè)開(kāi)發(fā)人員自己也應(yīng)當(dāng)具備一定的工程素養(yǎng)。比如,我們?cè)陂_(kāi)發(fā)初期時(shí),應(yīng)當(dāng)對(duì)所編寫(xiě)的有價(jià)值的源代碼及時(shí)備份,即使有些代碼在后續(xù)階段似乎沒(méi)有用處了也不妨“敝帚自珍”。在VC編程中我經(jīng)常遇到的問(wèn)題是,一個(gè)不算小的編寫(xiě)了很久的程序,在稍微擴(kuò)展一點(diǎn)功能時(shí)出現(xiàn)了故障,而最撓頭的時(shí)花了很多時(shí)間也無(wú)法排故,所幸的是對(duì)原來(lái)的程序我還有備份,可以重新再來(lái)--功能還要加,只是還一種編程思路去實(shí)現(xiàn)相同的功能。說(shuō)實(shí)在的,本人在VC開(kāi)發(fā)中,如果要總結(jié)“解決了多少問(wèn)題”,不如說(shuō)很多時(shí)候是采用"游擊戰(zhàn)"巧妙地"繞過(guò)"了一些棘手的問(wèn)題。--尤其在軟件交工處于倒計(jì)時(shí)的開(kāi)發(fā)后期出現(xiàn)的故障,往往你已經(jīng)沒(méi)有時(shí)間去找到故障,而是用前一個(gè)完好的VC Project去嘗試另一條捷徑。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。