動態記憶體管理

2021-10-04 04:28:47 字數 1053 閱讀 2539

為了更加靈活的確定申請空間的大小(空間較大),使用動態記憶體函式動態開闢記憶體空間。

一.動態記憶體函式

1.malloc

函式原型為voidmalloc(size_t size)

在堆區申請size個位元組的空間,返回起始位址。size為0是未定義行為。

2.calloc

void calloc(size_t num,siz_t size)

同malloc功能一樣,在堆區中申請num * size個位元組的空間。唯一 區別是申請空間的同時將空間初始化為0.

3.realloc

函式原型為void* realloc(void* p,size_t size).

其中p為malloc或者calloc函式返回的起始位址。realloc用於在原來動態申請得到的空間的基礎上擴充容量。若原來的空間之後沒有足夠的空間,則會重新申請size個位元組的空間,然後將原來的內容拷貝到新申請的空間中,最後釋放原來申請的空間。返回新申請空間的起始位址了。

4.free

函式原型為void free(void* p),用於釋放動態申請的空間。

(1)若p指向的空間不是動態申請的,則是未定義行為。

(2)若p為null,則函式什麼也不做。

二.常見的動態記憶體錯誤

1.動態申請記憶體之後要判空,否則若申請失敗返回的是空指標。對空指標解引用是未定義行為。

2.對動態記憶體開闢空間的越界訪問,同陣列類似,下標的合法範圍是0-size-1。

3.對非動態記憶體使用free釋放(如釋放區域性變數的空間)

4.使用free釋放動態記憶體的一部分(如申請空間返回的起始位址為0x100,大小為100個位元組的空間,free(0x101))。

5.對同一塊動態記憶體進行多次釋放。

6.忘記釋放動態記憶體(將導致記憶體洩露)

三.c/c++程式的記憶體分配

區域性變數位於棧區,棧區的空間較小,申請速度極快。**塊結束則釋放。

動態申請的記憶體位於堆區,堆區的空間非常大,申請速度較慢。程式結束時才釋放。

靜態變數、全域性變數位於資料段。程式結束時才釋放。

編譯生成的二進位制指令位於**段。

動態記憶體管理

首先應該明白物件的三種內部的儲存方式 自動儲存,靜態儲存,和動態儲存。當執行離開當期程式塊的時候,堆疊指標返回到它進入程式塊 之前的地方,有效的銷毀了那個程式塊的自動變數。重新進入這個塊會再次建立所有的自動變數。靜態物件宣告或者在檔案域中。動態物件是存在系統呼叫 的在執行期中建立並且儲存在堆中,這是...

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,new表示式返回指向新建立物件的指標,我們通過該指標來訪問此物件。int i int pi new int 這個new表示式在自由儲存區中分配建立了乙個整型物件,並返回此物件的位址,並用該位...

動態記憶體管理

c語言使用malloc calloc realloc free進行動態記憶體管理。void test c 通過new和delete動態管理記憶體。new delete動態管理物件。new delete動態管理物件陣列。void test void test int globalvar 1 stati...