野指針的生成及其產生的原因一,指向不確定地址的指針變量。(即沒有初始化)使用野指針易因內存洩露出現段錯誤。而造成內存洩露的原因有兩個:
1,訪問了沒有權限的內存,如果正確使用指針,系統會給指針分配相應的內存空間,
如果指針指向了的內存不是系統分配的,則判定為沒有權限。
2,訪問了已經釋放的內存。
二,指針p被free或者delete之後,沒有置為NULL,讓人誤以為p是個合法的指針。 指針p被free或delete以後其地址仍然不變(非NULL),只是該地址對應的內存 是垃圾,p成了“野指針”,
三,指針操作超越了變量的作用范圍如何有效的避免的野指針的出現
1,當一個指針沒有指向時,我們一般默認指向NULL。(NULL代表內存的0地址,並且NULL是不允許做任何操作的)
char * buf = new char[128];
char * buf1 = buf;
delete buf;
buf = NULL;
可以養成編程好習慣,在每次用完指針時,將其刪除(比如多用new和delete),並置0。(buf
= NULL)
原因:buf放在棧裡,而他所指的對象放在自由存儲區,調用了free或者是delete之後,我們只是把自由存儲區的空間釋放掉了,但是對於buf,他會一直維持到他的作用域結束,然後由函數本身(或者是調用者,這取決於函數的申明方式)進行清理,所以你一旦delete之後,立刻把它置0(buf = NULL;),讓他指向內存地址中不存在的地址空間,那麼,我們以後一旦不小心再次使用他,我們在編譯階段就可以得到錯誤信息,從根本上杜絕了“野指針錯誤”,不會意外得改動數據,甚至導致系統出錯。
二,使用malloc分配內存。(在堆空間裡分配內存)
#difine MAX_SIZE 1024;
char *ptr = (char *) maollc (sizeof (char) * MAX_SIZE);
malloc的使用依照下面的流程:
1.分配內存。(分配成功,返回內存的首地址;分配不成功,返回NULL)。
2.檢查是否分配成功(若失敗,則 exit(1) 退出程序)。
3.清空內存中的數據 (malloc分配的空間裡可能存在垃圾值,因此我們需要清空,可以用到memset或bzero 函數)。
4.使用內存。
5.釋放內存(free,這時ptr又變成野指針)。
6.寫成NULL。