內存泄漏

1、程序和數據存儲位置

(1)PC和單片機區別

    x86的PC機cpu在運行時程序是存儲在RAM中,而單片機等嵌入式系統則是存在flash中的。 
    pc機在運行程序的時候將程序從外存(硬盤)中,調入到RAM中運行,cpu從RAM中讀取程序和數據;而單片機的程序則是固化在flash中,cpu運行時直接從flash中讀取程序,從RAM中讀取數據 。
(2)單片機

    RAM用於數據的存儲,用flash的話比如我要對某字節存儲,那麼就需要把整頁都擦除,其他地方的數據要保留就得進行緩存。裸機程序指令就在Flash(Flash memory)中存放,而數據就放在了RAM中(flash的寫入次數有限制,同時它的速度和RAM還是差很多)。更廣泛說,在單片機上RAM存放data段,bss段,堆棧段;ROM(EPROM,EEPROM,Flash等非易失性存儲設備)存放代碼,只讀數據段。

2、堆區和棧區

  1. 從靜態存儲區域分配:它是由編譯器自動分配和釋放的,即內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,直到整個程序運行結束時才被釋放,如全局變量與 static 變量。
  2. 在棧上分配:它同樣也是由編譯器自動分配和釋放的,即在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元將被自動釋放。需要注意的是,棧內存分配運算內置於處理器的指令集中,它的運行效率一般很高,但是分配的內存容量有限。
  3. 從堆上分配:也被稱爲動態內存分配,它是由程序員手動完成申請和釋放的。即程序在運行的時候由程序員使用內存分配函數(如 malloc 函數、new)來申請任意多少的內存,使用完之後再由程序員自己負責使用內存釋放函數(如 free 函數、delete)來釋放內存。也就是說,動態內存的整個生存期是由程序員自己決定的,使用非常靈活。需要注意的是,如果在堆上分配了內存空間,就必須及時釋放它,否則將會導致運行的程序出現內存泄漏等錯誤。

內存泄漏幾種情況

來看一個網上很流行的經典例子:

main.cpp 
int a = 0; 全局初始化區 
char *p1; 全局未初始化區 
main() 

int b; 棧 
char s[] = "abc"; 棧 
char *p2; 棧 
char *p3 = "123456"; 123456\0在常量區,p3在棧上。 
static int c =0; 全局(靜態)初始化區 
p1 = (char *)malloc(10);  堆 
p2 = (char *)malloc(20);  堆 
}

3、數據結構中的堆和棧

 堆和棧都是一種數據項按序排列的數據結構。

棧就像裝數據的桶或箱子

    我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。這就如同我們要取出放在箱子裏面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。

堆像一棵倒過來的樹

   而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。

4、單例模式

c++實現單例模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章