1. 程式人生 > >如何形象的解釋記憶體洩漏和野指標

如何形象的解釋記憶體洩漏和野指標

記憶體洩漏:首先要說到如何為一塊變數申請一塊記憶體空間。

當你要為變數a申請一塊記憶體空間的時候,需要用到malloc函式。如何申請這塊記憶體空間呢?這就變成程式的工作了。程式首先會向系統申請一塊記憶體空間,然後程式會把申請好的這塊記憶體空間的首地址賦給變數a,假設這時候變數a拿到的首地址為0x1234,如果我們現在要對變數a進行迴圈操作,那麼每迴圈一次,變數a就會拿到一個新的首地址,這樣的話,記憶體空間就會被不斷的分配給變數a。

但是現在要注意的是每拿到一次新的首地址,舊的首地址就會被覆蓋,但是舊的記憶體空間的使用權依然在程式手裡。這裡要分清楚兩個概念,系統和程式。通常情況下,是由程式向系統申請空間,空間的分配權在系統手裡。雖然舊的地址唄覆蓋,但是使用權依舊掌握在程式手中,所以,程式能使用的空間越來越少,最終導致記憶體不夠而洩露。

野指標:當程式向系統申請一塊記憶體空間時候,程式會把申請號好的這塊記憶體空間的首地址賦給變數a,假設變數a拿到的首地址是0x3456,那麼當這塊空間使用完成被free釋放了之後,這塊空間的使用權又被程式還給了系統,但是這個時候如果沒有給變數a賦NULL值,那麼變數a手裡拿到的依舊還是這個首地址0x3456,這個地址是沒有被銷燬的,所以既然它有一個首地址,那麼就可以指向一個地址,但是,由於這個地址所在的記憶體空間的使用權已經不屬於程式,因此,這個時候變數a的指向操作就是不合法的,這樣的指標就被稱為野指標。

在這裡我用一個比喻來說明什麼是記憶體洩漏,什麼是指標。

張三指的是變數a;房產證指的是記憶體空間的使用權;鑰匙指的是記憶體空間的首地址。

當張三拿到房子1的房產證和鑰匙,這個時候他就可以使用這個房子1,


過了一段時間,張三又買了一套房子,我們簡稱房子2,但是這個時候張三把房子1的鑰匙給丟了,由於房產證依然是張三的,所以別人不能住這個房子,但是由於張三沒有了鑰匙,所以他也不能進到房子1裡,房子1就這樣被空置下來。


以此類推,當張三買了很多套房子,但是由於他弄丟了鑰匙住不了,而別人是因為沒有房產證,所以也住不了,所以這些房子都空置下來了。當空置的房子過多時,就變成了記憶體洩漏。

當張三拿到房子的鑰匙和房產證,當房產證被free了(記憶體被釋放),也就等於說房產證丟了。


這個時候如果變數a沒有賦NULL值,也就等於說鑰匙還在張三手裡(首地址還在變數a中),所以雖然鑰匙還在張三手中,但是沒有房產證,他再進這個房子就變成非法進入了,這就是野指標。


相關推薦

如何形象解釋記憶體洩漏指標

記憶體洩漏:首先要說到如何為一塊變數申請一塊記憶體空間。 當你要為變數a申請一塊記憶體空間的時候,需要用到malloc函式。如何申請這塊記憶體空間呢?這就變成程式的工作了。程式首先會向系統申請一塊記憶體空間,然後程式會把申請好的這塊記憶體空間的首地址賦給變數a,假設這時候變

淺談記憶體洩漏指標記憶體申請

拿到quiz好難過,記憶體洩漏一個Vector一個Array秀的我頭疼。 記憶體洩漏 百度百科上的定義:記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。 一看定義

關於 記憶體洩漏指標

記憶體洩漏: 動態申請的記憶體空間沒有正常釋放,但也不能繼續使用; char *a = new char('a'); char *b = new char('b'); a = b; ‘a’的空間未被釋放,也無法訪問,形成記憶體洩漏; (基類的解構函

[android進階篇]MVP模式優化,防止記憶體洩漏指標問題

MVPOptimize MVP模式優化 主要優化P層V層互相持有物件,不能及時回收/銷燬問題 如果你看過我的MVP整合教程【android進階篇】MVP+Retrofit+RxJava框架結合 你可能就會發現,如果頁面在請求的時候,網路不好,這時使用

從預設解構函式學習c++,new,delete,記憶體洩漏指標

預設解構函式:當系統沒有顯式定義解構函式,編譯器同樣會為物件定義一個預設解構函式,預設的解構函式只能釋放普通資料成員所佔用的空間,無法通過釋放通過new和malloc進行申請的空間,因此避免記憶體洩漏,我們要顯式的解構函式對申請的空間釋放。 記憶體洩漏(Memory Leak)是指程式中己動態分配的堆記憶體

(整合多篇文章)C++懸垂指標指標記憶體洩漏垃圾回收機制

C++的記憶體回收機制 當我們使用new為一個物件分配了空間之後,在這個物件結束使用之後,我們必須人為的去釋放這塊記憶體(delete) Java的記憶體回收機制  當用new 建立一個Java物件時,它可以存活於作用域之外。所以在上述程式碼中,引用 str(

java記憶體洩漏記憶體溢位

java記憶體洩漏和記憶體溢位 概念 a)記憶體洩露:被分配物件可達但無用 b)記憶體溢位:無法申請到足夠的記憶體而產生的錯誤 記憶體洩漏場景 a)建立和應用生命週期一樣的單例物件 b)建立匿名內部類的靜態物件 c)未關閉資源 d)長時間存在的集合容器中建立生命週期短

記憶體洩漏記憶體溢位的區別聯絡

1、記憶體洩漏memory leak :是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。 2、記憶體溢位 out of memory :指程式申請記憶體時,沒有足夠的記憶體供申請者使

JVM虛擬機器學習--記憶體洩漏記憶體溢位

記憶體洩漏memory leak :是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。 記憶體溢位 out of memory :指程式申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,給了你一塊

記憶體洩漏記憶體溢位的區別與解決方式

記憶體洩漏(memory leak ) 記憶體溢位 (out of memory) 記憶體洩露 :是指程式在申請記憶體後,無法釋放已申請的記憶體空間就造成了記憶體洩漏,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。 我們知道了記憶體洩漏的原因而記憶體溢位則有可能是

記憶體洩漏記憶體溢位(不看後悔,一看必懂)

​​​​​​​記憶體洩漏 記憶體洩漏是指不再被程式使用的物件或者變數還在記憶體中佔儲存空間 記憶體洩漏主要有兩種情況:一是在堆中申請的空間沒有被釋放;二是物件已經不再使用,但仍然在記憶體中保留著,垃圾回收器則無法保證不再使用的物件會被釋放.因此java語言中的記憶

記憶體洩漏記憶體溢位

1、記憶體洩漏memory leak :是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶體洩漏似乎不會有大的影響,但記憶體洩漏堆積後的後果就是記憶體溢位。  2、記憶體溢位 out of memory :指程式申請記憶體時,沒有足夠的記憶體供申請者使用,或者說,

什麼是堆,棧,記憶體洩漏記憶體溢位?

       一個執行緒的開銷包括:       核心模式下的開銷(核心堆疊,物件管理所需記憶體)       使用者模式下的開銷(執行緒區域性儲存、執行緒環境塊、堆疊、CRT、MFC、COM等等等等)       通常,執行緒數目的瓶頸在於執行緒自己的堆疊。Visual C++編譯器預設設定是每個執行緒

使用valgrind來發現記憶體洩漏非法記憶體操作

原文地址:http://www.cprogramming.com/debugging/valgrind.html 翻譯難免會因個人水平原因而有不準確的地方,請大家多批評指正,上面是原文連結,大家也可以直接去看看。 valgrind是Linux平臺一個多用途的程式碼審查和記憶

c語言記憶體管理、指標、malloc

C語言一共定義四個區塊:程式碼區、全域性變數和靜態變數區、棧、堆 針對四個區塊,使用者的記憶體分配也有三種不同的方式: 靜態變數區:在程式碼編譯的時候就分配好了,比如全域性變數,被static

記憶體洩漏溢位整理(二)

一、Android的記憶體機制 android應用層是由java開發的,android的davlik虛擬機器與jvm也類似,只不過它是基於暫存器的。在java中,通過new為物件分配記憶體,所有物件在java堆內分配空間;而記憶體的釋放是由垃圾收集器(GC)來回收的。

C語言 空指標指標

int *p1 = NULL;//空指標 int *p2;//野指標指向空的指標是空指標,指向一塊未知區域的指標是野指標例如  int *p = 0x123456;   這就是一個野指標,我們並不知道這

徹底搞清c/c++中的幾個指標概念:懸垂指標智慧指標以及啞指標指標

先看看下面兩段程式碼執行結果: #include<iostream> //#include <windows.h> using namespace std; int *p=NULL; void fun() {int i=10;p=&i;} v

空懸指標指標區別

空懸指標是:它曾經指向一個有效地址,但是現在不再指向有效地址,就是原來的那塊地址不能通過這個指標區訪問了。這通常是因為指標所指的記憶體單位被釋放了並且不再有效了。空懸指標存在並沒有什麼問題,除非你嘗試通過這個指標訪問指向的地址空間。不遺留任何懸空指標總是最好的實踐方式。野指標

iOS開發時OC與C的混編中,strcpy導致的記憶體溢位、指標

在最近的專案開發中,由於需要使用C語言的演算法供給OC專案呼叫,所以研究了一下OC與C的混編及.a庫的相關生成。而在混編的過程中,C語言的演算法都能正常呼叫了,但是被一個問題困擾了很長一段時間,就是在