野指针产生原因
野指針,也就是指向不可用內存區域(垃圾內存)的指針。
如果對野指針進行操作,將會使程序發生不可預知的錯誤,甚至可能直接引起崩潰。
造成野指針的原因有三種:
1.指針沒有被初始化
任何指針變量被剛創建時不會被自動初始化為NULL指針。所以,指針變量在創建的同時應當被初始化分配內存(使用malloc函數、calloc函數或new操作符),要么將指針設置為NULL,要么讓它指向合法的內存。例如:
VC++編譯器,在Debug模式下會把未初始化的棧內存上的指針全部填成 0xcccccccc ,當字符串看就是 “燙燙燙燙……”;會把未初始化的堆內存上的指針全部填成 0xcdcdcdcd,當字符串看就是 “屯屯屯屯……”。在Release模式下,編譯器則會將指針賦隨機值。
在linux,g++ 環境下,會將野指針置0,使它指向NULL。
2.指針被free或者delete后,指針指向的內存被釋放了,指針本身沒有被設置為NULL
free和delete只是把指針所指向的內存給釋放掉,但并沒有把指針本身給清理掉。這時候的指針依然指向原來的位置,只不過這個位置的內存數據已經被銷毀,此時的這個指針指向的內存就是一個垃圾內存。
所以在指針指向的內存被釋放后,應該將指針置為NULL。
3.指針超過了變量的作用范圍
即在變量的作用范圍之外使用了指向變量地址的指針。這一般發生在將調用函數中的局部變量的地址傳出來引起的。這點容易被忽略,雖然代碼是很可能可以執行無誤,然而卻是極其危險的。在執行指針的++操作時候,容易發生指針訪問越界,訪問到不該訪問的內存空間。
還有一種情況是指針指向一個臨時變量的的應用。局部變量的作用范圍雖然已經結束,內存已經被釋放,然而地址值仍是可用的,不過隨時都可能被內存管理分配給其他變量。當變量被釋放時,指針變成一個野指針。
總結
- 上一篇: 控件获取图像可从几方面取得?_基于图像特
- 下一篇: [教程]HP Envy J/K/Q/N系