概念:野指針指向了一塊隨機記憶體空間,不受程式控制。如指針指向已經被刪除的對象或者指向一塊沒有訪問許可權的記憶體空間,之後如果對其再解引用的話,就會出現問題。 野指針產生的原因: 1、指針定義時未被初始化:指針在被定義的時候,如果程式不對其進行初始化的話,它會指向隨機區域,因為任何指針變數(除了stati ...
概念:野指針指向了一塊隨機記憶體空間,不受程式控制。如指針指向已經被刪除的對象或者指向一塊沒有訪問許可權的記憶體空間,之後如果對其再解引用的話,就會出現問題。
野指針產生的原因:
1、指針定義時未被初始化:指針在被定義的時候,如果程式不對其進行初始化的話,它會指向隨機區域,因為任何指針變數(除了static修飾的指針變數)在被定義的時候是不會被置空的,它的預設值是隨機的。
2、指針被釋放時沒有被置空:我們在用malloc開闢記憶體空間時,要檢查返回值是否為空,如果為空,則開闢失敗;如果不為空,則指針指向的是開闢的記憶體空間的首地址。指針指向的記憶體空間在用free()或者delete(註意delete只是一個操作符,而free()是一個函數)釋放後,如果程式員沒有對其置空或者其他的賦值操作,就會使其成為一個野指針。
3、指針操作超越變數作用域:不要返回指向棧記憶體的指針或引用,因為棧記憶體在函數結束的時候會被釋放,示例(轉自高質量C++):
class A
{
public:
void Func(void)
{
cout << “Func of class A” << endl;
}
};
class B
{
public:
A *p;
void Test(void)
{
A a;
p = &a; // 註意 a 的生命期 ,只在這個函數Test中,而不是整個class B
}
void Test1()
{
p->Func(); // p 是“野指針”
}
};
函數 Test1 在執行語句 p->Func()時,p 的值還是 a 的地址,對象 a 的內容已經被清除,所以 p 就成了“野指針” 。
野指針的危害:
野指針的問題在於,指針指向的記憶體已經無效了,而指針沒有被置空,解引用一個非空的無效指針是一個未被定義的行為,也就是說不一定導致段錯誤,野指針很難定位到是哪裡出現的問題,在哪裡這個指針就失效了,不好查找出錯的原因。所以調試起來會很麻煩,有時候會需要很長的時間。
規避方法
初始化指針時將其置為NULL,之後再對其進行操作。
釋放指針時將其置為NULL,最好在編寫代碼時將free()函數封裝一下,在調用free()後就將指針置為NULL。
要想徹底地避免野指針,最好的辦法就是養成一個良好的編程習慣。