新手學習C/C++編程過程當中常見的那些坑,必定要多多注意!

        C/C++中的指針讓程序員有了更多的靈活性,但它同時也是一把雙刃劍,若是用的很差,則會讓你的程序出現各類各樣的問題,有人說,C/C++程序員有一半的工做量是花在處理由指針引發的bug上,可想而知,指針中包含的陷阱是多麼可怕。既然如此,咱們在編寫代碼的時候就應該把好關。c++

        要想在編寫代碼的時候儘量避免指針帶來的問題,就須要知道不恰當的使用指針到底會引起哪些問題, 又該如何去避免它?下面一塊兒來總結在使用指針時容易遇到的問題。程序員


 

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++代碼代碼中多注意使用智能指針

二、不要使用野指針

        野指針也叫懸掛指針,是指向「垃圾」內存的指針,使用「野指針」會讓程序出現不肯定的行爲。

        注意,野指針不是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變量的生存期是整個程序運行期間

三、不要使用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++編程學習基地【點擊進入】!


 

都是學編程小夥伴們,帶你入個門仍是簡簡單單啦,一塊兒學習,一塊兒加油~

還有許多學習資料和視頻,相信你會喜歡的!

涉及:遊戲開發、經常使用軟件開發、編程基礎知識、課程設計、黑客等等......

相關文章
相關標籤/搜索