C 記憶體管理

2021-10-10 02:07:05 字數 2245 閱讀 4175

在我們寫**時,會定義很多的變數,有靜態的、全域性的、區域性的等等,但是這些變數在記憶體中是分別存放在不同的位置上;

在c語言中,我們是通過malloc/calloc/realloc來申請動態記憶體的,通過free來釋放記憶體的;

malloc:申請一塊空間,對裡面的內容不做任何處理;

calloc:申請一塊空間,並對立面的值全部初始化為0;

realloc:對空間進行擴容,先申請一片更大的空間,再將原有空間的資訊拷貝過來,最後再釋放原有空間;

free:對malloc/calloc/realloc所申請的空間進行釋放,如不釋放,則會造成記憶體洩漏,危害極大;

1、動態申請記憶體——new

c++中通常使用new來申請記憶體,原因是:用malloc申請空間,不會進行初始化,這樣自定義型別就不能夠進行初始化,所以使用new動態申請空間;

(1)申請方式

型別  型別名 = new  型別;
例如:

class

data

data

(int year =0,

int month =0,

int day =0)

~data()

};intmain()

(2)底層實現原理

operator new是乙個系統提供的全域性函式,new是對operator new的乙個封裝,實際上在使用new申請時,會呼叫operator new;

而operator new函式內部會用到malloc,實際上是malloc + 異常機制

所以在呼叫new對自定義型別申請空間時,底層上都是呼叫operator new函式申請空間,再呼叫建構函式給空間賦值;

2、釋放記憶體——delete

c++中與new配套的釋放記憶體的函式就是delete,同樣的,如果使用free來釋放自定義型別的空間的話,並不會呼叫自定義型別的析構函式,也就是說不會釋放自定義型別裡的資源,所以使用delete函式進行資源的釋放;

(1)釋放方式

delete  變數名;    //釋放乙個空間

delete 變數名; //釋放連續空間

接上上面的例子:

class

data

data

(int year =0,

int month =0,

int day =0)

~data()

};intmain()

(2)底層實現原理

operator delete與operator new函式一樣,都是作業系統提供的全域性函式,delete是對其的乙個封裝;

operator delete內部就是通過free函式來完成空間釋放的,這裡如果失敗不會拋異常;

所以通過delete釋放自定義型別空間時,都是先呼叫析構函式將自定義型別內部的資源先釋放掉,再呼叫operator delete函式將空間釋放;

1、什麼是記憶體洩漏

記憶體洩漏是因為疏忽或錯誤造成程式未能釋放已經不再使用記憶體的情況。記憶體洩漏並不是指內存在物理層面上的消失,而是指某段記憶體被分配出去後,因為一些錯誤而不受控制;

2、記憶體洩漏的危害

記憶體洩漏會導致系統可用記憶體越來越少,最終宕機;

3、記憶體洩漏種類

堆記憶體洩漏、系統記憶體洩漏;

4、如何防範記憶體洩漏

(1)養成良好的**規範,即申請乙個記憶體後要記得釋放;

(2)採用rall思想或智慧型指標來管理資源;

(3)使用記憶體檢測工具:常見的有valgrind;

C 記憶體管理 C 記憶體分類

c 記憶體管理 記憶體分類 moakap 在編寫程式過程中,程式設計師必須清楚程式記憶體的分配機制,合理進行記憶體管理,這樣才能得到高效的程式。同時,如果對c 記憶體分配基本概念不理解,使用不當,一方面浪費了寶貴的記憶體資源,降低了程式執行效率,另一方面還會造成程式中意想不到的錯誤。在 c 程式中,...

C 記憶體管理

在嵌入式系統中使用c 的乙個常見問題是記憶體分配,即對new 和 delete 操作符的失控。具有諷刺意味的是,問題的根源卻是c 對記憶體的管理非常的容易而且安全。具體地說,當乙個物件被消除時,它的析構函式能夠安全的釋放所分配的記憶體。這當然是個好事情,但是這種使用的簡單性使得程式設計師們過度使用n...

c 記憶體管理

這裡對我暫時所了解的記憶體機制做個記錄,以後再補。首先是記憶體分配 記憶體主要分為3個部分 一是從靜態儲存區域分配。編譯時分配好,主要存放全域性變數,static變數,程式結束釋放。二是從堆疊區域分配。函式內區域性變數存放的地方。隨變數生命週期自動釋放。效率較高,但大小有限。三是從記憶體池分配,即從...