C/C++中的指標讓程式員有了更多的靈活性,但它同時也是一把雙刃劍,如果用的不好,則會讓你的程式出現各種各樣的問題,有人說,C/C++程式員有一半的作業量是花在處理由指標引起的bug上,可想而知,指標中包含的陷阱是多么可怕,既然如此,我們在撰寫代碼的時候就應該把好關,
要想在撰寫代碼的時候盡可能避免指標帶來的問題,就需要知道不恰當的使用指標到底會引發哪些問題, 又該如何去避免它?下面一起來總結在使用指標時容易遇到的問題,
1.避免記憶體泄露
程式在運行的時候需要記憶體,同時我們也知道記憶體是有限的,是計算機特別寶貴的資源,對于使用完的記憶體,應當及時的歸還給作業系統,
在c/c++中,如果是堆疊上的記憶體(比如說函式中的區域非靜態變數),在使用完之后,作業系統會幫我們自動回收;但是如果是通過動態分配得到的堆上的記憶體,需要我們手動釋放,
如果我們在程式中忘了釋放這些動態記憶體,而程式又是會持續運行的服務行程,會導致記憶體占用越來越高,輕者致殘影響系統性能,重者致命導致行程崩潰,
總之一句話,不再用到的記憶體沒有釋放,就叫做記憶體泄露,記憶體泄露的問題很嚴重,好了,讓我們看幾個記憶體泄露的案例,
在C/C++中,通過動態記憶體分配函式或者new運算子分配的動態記憶體在使用完之后需要手動釋放,否則會造成記憶體泄露,
建議:代碼撰寫時注意malloc/free, new/delete成對使用
即使在malloc/new后顯示呼叫了free/delete釋放記憶體,但是由于例外可能會導致釋放記憶體的free/delete陳述句得不到執行,也會發生記憶體泄露,下面的例子就是這種情況,
從運行結果來看,類的解構式沒有被執行,可推知delete陳述句并沒有得到執行,
有人會說,這還不簡單,直接在catch陳述句的cout << "Something has gone wrong" << endl;下面之后加個delete t不就行了?
沒錯,這只是個幾十行代碼的測驗程式,你可能一下就看出問題了,但是如果你面對的是一個龐大的工程時候,我想你內心一定是好崩潰的,還有更好的辦法來解決這種問題,就是智能指標,后面會有專門的文章介紹,
建議:C++代碼代碼中多注意使用智能指標
2、不要使用野指標
野指標也叫懸掛指標,是指向“垃圾”記憶體的指標,使用“野指標”會讓程式出現不確定的行為,
注意,野指標不是NULL指標, 它比NULL指標更容易犯錯,因為它不能通過形如 if (NULL == p)的判斷陳述句來預防,只能我們自己在寫代碼時多注意,
指標p被free或者delete之后,沒有置為NULL,讓人誤以為p是個合法的指標,事實上free或delete只是把指標所指的記憶體給釋放掉,但是指標的值還是這塊記憶體的地址,只不過這塊記憶體已經被回收了不能被該行程再使用,下面的例子就是一個典型的使用野指標的案例,
建議:free或delete之后將相應的指標設定為NULL
在創建指標變數p時忘了初始化,p的值是個隨機的垃圾值,此時讀寫該指標都是危險的,程式會產生不確定的行為
建議:定義指標變數的時候盡量初始化,哪怕初始化為NULL也好
c/c++中,區域變數是存放在堆疊中的,它的特點是隨函式呼叫時創建隨函式結束時銷毀,因此在程式中將區域變數的地址回傳后賦值給一個指標,這個指標指向的是一個已經被回收的記憶體,這也是一種野指標,
看看下面的例子,原本是想將fun函式中的變數i的地址回傳給p,用p訪問這個變數,這個列印出*p是32767,并不是變數i的值8,像這種bug,一旦在大的專案中出現是很難定位的,
建議:不要在函式中回傳區域變數的地址,如果代碼的邏輯非要是一個區域變數的地址,那么該區域變數一定要申明為static型別,因為static變數的生存期是整個程式運行期間
3、不要使用NULL指標
大家都知道,在程式中不能使用NULL指標,但是如果不注意,程式中還是有可能在你的意料之外就使用到NULL指標,下面看兩個比較容易出問題的例子,
動態記憶體分配函式分配記憶體的時,有可能會分配失敗,此時回傳NULL
從程式運行結果來看,malloc分配失敗回傳NULL賦給p,再通過p訪問其所指向的0地址記憶體內容時,出現"Segmentation fault"錯誤,
建議:在使用記憶體分配函式分配記憶體的時候,應該用i f(p==NULL) 或if(p!=NULL)進行防錯處理,
此外,在含有指標引數的函式,也是有可能會誤用到NULL指標,當呼叫該函式時傳遞的指標是個空指標,如果沒有if(p!=NULL) 的判斷條件,那么在后面使用指標的時候麻煩就大了,下面的例子就是這種情況,
建議:對于含有指標引數的函式,也應當在函式入口處用if(p==NULL) 或if(p!=NULL)進行防錯處理,
看到這里是不是有學習到了很多呢~
如果你很想學會編程,那么小編推薦我的C語言/C++編程學習基地【點擊進入】!

都是學編程小伙伴們,帶你入個門還是簡簡單單啦,一起學習,一起加油~
還有許多學習資料和視頻,相信你會喜歡的!
涉及:游戲開發、常用軟體開發、編程基礎知識、課程設計、黑客等等......

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/4490.html
標籤:C
