1. 程式人生 > >C/C++ 野指標 殭屍物件

C/C++ 野指標 殭屍物件

今天在實現平衡二叉樹的一系列操作的時候,發現了一個以前不經常注意的地方,記錄一下;

每個程式在執行時都會佔用一塊可用的記憶體空間(malloc、new),用於存放動態分配的物件,此記憶體空間稱為自由儲存區或堆。

在使用完這塊記憶體之後,就需要我們自己釋放這塊記憶體,否則程式就會存在記憶體洩漏的問題。

這裡要注意野指標、殭屍物件的概念:

      野指標:指標所指向的記憶體已經被釋放掉,而指標沒有被置為NULL,則會變成野指標

      1、free、delet 釋放僅僅是指標指向的記憶體(堆空間),讓這塊記憶體可以被系統重新分配,而不是銷燬指標物件,指標物件是個變數,存在自己的生命週期,隨程式的結束而被銷燬;

      2、另外,free、delet並不會將指標物件置為NULL,所以在釋放空間之後,一定要手動置為NULL,防止後面程式以為他是合法指標,再次進行解引用操作,造成錯誤;

殭屍物件:指已經被釋放的空間物件

1、malloc像系統在堆空間申請一塊閒置的空間,作為程式需要資料的存放,此時這塊空間受保護,不會被其它程式申請

2、free告訴系統不再需要這塊空間,可以釋放掉,允許系統將它分配給其它程式使用

3、free之後,這塊空間(指標指向地址)的資料還是存在的,當分配給其它物件的時候,才會被修改;

使用野指標訪問殭屍物件:

1、free指標之後,僅僅是告訴系統回收這塊空間,但是空間內的資料以及指標的值(地址)都不會發生改變;

2、因為指標的值和空間資料都還在,所以是可以通過解引用野指標來訪問殭屍物件的,但是最好不要這麼做,因為如果這塊空間被重新分配了重要資料,可能會造成嚴重的問題,free之後必須手動將指標置為NULL;

  3、從下面可以看到,指標已經被free掉了,但是還是可以通過這個指標訪問到原來的空間,所以每次釋放指標以後,一定要置為NULL,這樣在解引用的時候就不會 誤操作到野指標

if( p != NULL )