1. 程式人生 > >C++——多次free和delete導致錯誤

C++——多次free和delete導致錯誤

     多次free和delete將會導致錯誤:

  指標變數本身也是一個變數,它本身也佔有記憶體空間,我們可以用記憶體中其它記憶體空間的地址為其賦值。倘若我們不給指標變數給他賦值,而是直接操作這個指標變數,編譯器會報錯的,因為編譯器檢測到該指標變數沒有初始化,就會認為這是語法錯誤。所以,使用初始化後的指標變數才是有意義的。delete和new的目的就是在堆內申請一個記憶體,將這個記憶體空間的首地址賦給一個指標變數。

          free:一次free一個指標的時候,只是清空該指標所指的堆中的對應空間,但該指標變數在棧中的值並沒有沒清空,它還是指向原來分配的記憶體空間(但是該記憶體空間已經不屬於該指標了,CPU隨時可把該指標原來所指的空間分配給任何一個指標變數)。這時,再free一次時,由於該指標已經沒有堆空間與之對應了,所以編譯器將會提示出錯。在C/C++程式設計時,malloc和new分配空間及free和delete釋放空間是一個難點,這裡很容易產生思維誤區,所以在實際程式設計時需要千萬注意手動分配的空間,要手動釋放,萬萬不可多次釋放同一堆空間。

          free 釋放這個指標佔用的空間,釋放後別的指標變數也可以得到這片空間,該空間的值並不一定是NULL。所以free後不能用是否為NULL來判斷

delete當一個指標被delete後,該指標就成了野指標(不指向任何記憶體空間的指標我們稱之為野指標,野指標所指向的地方是隨機的)。當再次delete該指標時,編譯器就會提示你操作非法。