記憶體動態管理

2021-07-28 06:04:17 字數 1733 閱讀 6804

記憶體動態管理:主要是指對「堆」記憶體或者自由記憶體的管理和使用

在c語言中使用malloc()和free()動態分配和釋放儲存單元。

malloc()以空間大小作為引數,不知道資料具體型別,因此分配空間後範圍的位址指標void*無法指向具體的資料,必須進行強制轉換後才可以指向具體型別資料。

c++提供了使用簡便而功能更強的new和delete算符來分配和**動態儲存單元。

具體如下:

//c語法///

ansi c標準邀請在使用動態分配函式是要包含#include命令將stdlib.h檔案包含進來。

但是目前使用的一些c系統中,用的是malloc.h標頭檔案。在使用中注意系統版本,當然有的系統不要求新增任何標頭檔案。

void*malloc(unsigned int size):開闢size大小的空間。

返回型別為void*是標準ansi c建議的,也就是說返回指標不指向任何具體的型別,如果想將這個指標賦給執行型別的指標變數應當進行顯式的轉換(強制型別轉換)。

應當指出,現在使用的許多c系統提供的malloc函式返回的型別為char*,如果想要將其賦給指定型別的指標變數仍要進行強制型別轉換。

對於程式設計師來說,無論函式返回的指標型別是void還是char型,用法是一樣的。

如果記憶體空間不夠,則函式返回null.

void* calloc(unsigned int num,unsigned int size):開闢num個大小為size位元組的空間。

void free(void *ptr):釋放ptr所指向的已分配空間。

ptr所指的物件必須是動態開闢(是原來用malloc函式分配)的空間。不能free兩次同一動態開闢的空間。

void* realloc(void *void,unsigned int size)

將ptr指向的儲存區(是原來用malloc函式分配的)的大小改為size個位元組。可以是原先分配的空間擴大或縮小。注意,新的儲存空間的位址與原儲存空間的位址不一定相同。

/c++語法//

new 資料型別

new 資料型別[元素個數]  //對陣列

delete 指向分配空間的指標變數   //如分配的是單個物件空間

delete 指向分配空間的指標變數   //如分配的是陣列物件空間

1、new和delete是運算子,不是函式。

2、如果 new 表示式無法獲取需要的記憶體空間,系統將拋出名為 bad_alloc 的異常,可以通過new的過載函式呼叫異常也不丟擲異常std::nothrow,另外還有placement new。

3、」delete指標」後,指標將變成懸垂指標,因此執行delete之後,最好立即將指標置為null.

警告:動態記憶體的管理容易出錯

下面三種常見的程式錯誤都與動態記憶體分配相關:

1. 刪除( delete )指向動態分配記憶體的指標失敗,因而無法將該塊記憶體返還給自由儲存區。刪除動態分配記憶體失敗稱為「記憶體洩漏(memory leak)」。記憶體洩漏很難發現,一般需等應用程式執行了一段時間後,耗盡了所有記憶體空間時,記憶體洩漏才會顯露出來。

2. 讀寫已刪除的物件。如果刪除指標所指向的物件之後,將指標置為 null 值,則比較容易檢測出這類錯誤。

3. 對同乙個記憶體空間使用兩次 delete 表示式。當兩個指標指向同乙個動態建立的物件,刪除時就會發生錯誤。如果在其中乙個指標上做 delete 運算,將該物件的記憶體空間返還給自由儲存區,然後接著 delete 第二個指標,此時則自由儲存區可能會被破壞。操縱動態分配的記憶體時,很容易發生上述錯誤,但這些錯誤卻難以跟蹤和修正。

動態記憶體管理

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

動態 記憶體管理

定義變數時,必須制定其資料型別和名字。而動態建立物件時,只需指定其資料型別,而不必為該物件命名。取而代之的是,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...