動態記憶體分配最常見的就是用來分配乙個某型別的陣列
。我們可以使用陣列來處理大量的資料,但實際上很多情況下我們並不知道此陣列會有多少個元素,所以在定義陣列時到底定義多大的陣列就要仔細考慮下了。比如,我們要對輸入的若干個數進行分析,得出所有的正數存到乙個陣列裡以備他用,這個正數陣列應該定義多大呢?如果大了可能會造成記憶體的浪費,如果小了可能會出現陣列
越界的情況。這種情況下比較理想的是判斷全部資料裡有多少個正數就定義多大的陣列,既不浪費記憶體也不會出現陣列越界的問題,這就需要用到動態記憶體分配了。
動態記憶體分配指的就是在程式執行過程中根據實際情況動態分配適量的記憶體,使用完以後再釋放
。動態記憶體分配時申請和釋放的記憶體單元叫做堆物件。申請和釋放的過程一般叫做建立和刪除。
一.c++動態記憶體分配運算子:new和delete
c++中new運算子用來動態分配記憶體,也可以稱為動態建立堆物件。使用new運算子動態分配記憶體的語法形式為:
new 型別名(初值列表);
此語句用於申請分配乙個記憶體空間,此記憶體空間存放由「型別名」表示的型別的資料,並用初值列表中列出的值初始化。
該語句會返回乙個由「型別名」表示的型別的指標,如果分配失敗則返回null。
我們動態建立乙個普通變數時,初始化就是為其賦值。例如:
int *p;
p = new int(10);
上面的語句動態分配了用來存放乙個整數資料的記憶體空間,同時把初始值10存入該記憶體空間中,也就是p指向的整形資料是10,最後把分配記憶體的首位址賦值給p。
如果我們動態建立的是乙個類的物件,那麼會根據初值列表呼叫該類合適的建構函式。
delete運算子用來刪除用new動態建立的堆物件,即釋放new動態分配的堆記憶體。
使用delete運算子的語法形式為:
delete 指標名;
如果被刪除的是普通變數,則會直接釋放動態分配的記憶體。如果被刪除的是物件,則該物件的析構函式被呼叫。
這裡要注意一下,
用new動態分配的記憶體只能用delete釋放一次,如果釋放第二次會出現錯誤。
動態建立物件的例子:
#include
using namespace std;
class cstudent
// 內聯函式
,返回m_nage
private:
int m_nage; // 私有資料
};int main()
程式執行結果是:
default constructor called.
destructor called.
constructor called.
destructor called.
用運算子new也可以建立陣列型別的堆物件,動態建立一維陣列的語法形式為:
new 型別名[下標表示式];
上面的下標表示式指明了陣列的元素個數。
如果動態分配記憶體成功,會返回乙個指向分配記憶體首位址的指標,如果分配失敗則返回空指標null。
這裡要注意的是,
為陣列動態分配記憶體時不能指定陣列元素的初值。
用new動態建立的陣列,也可以用delete刪除,但是指標名前要加「」。delete陣列的語法形式為:
delete 指標名;
動態建立物件陣列的簡單例子:
#include
using namespace std;
class cstudent
// 內聯函式,返回m_nage
private:
int m_nage; // 私有資料
};int main()
程式執行結果是:
default constructor called.
default constructor called.
destructor called.
destructor called.
用new動態建立多維陣列的語法形式為:
new 型別名t[下標表示式1][下標表示式2]...;
上面的下標表示式1可以是任何結果為正整數的表示式,而其他下標表示式必須是結果為正整數的常量表示式。這個語句如果執行成功則返回指向分配記憶體首位址的指標,但是這個指標不是t型別的指標,而是指向t型別陣列的指標。
例如:int *p = new int[2][3];是錯誤的,因為這裡new返回的是指向乙個有3個元素的一維int型
陣列的指標,而p是乙個指向int型
資料解答:1.我們可以把多維陣列看成是由除第一維外其他維資料組成的一維陣列,此一維陣列的元素個數就是第乙個下標表示式的值,比如上面的int[2][3]可以看成是有2個元素的一維陣列,每個元素又含有3個整數。new建立多維陣列返回的是指向一維陣列第乙個元素(也是陣列)的指標,對於new int[2][3]來說第乙個元素實際上是二維陣列的第一行,對於new int[2][3][4]第乙個元素實際上是乙個3x4的二維陣列。
2.宣告指向陣列的指標的形式是:
型別名 (*指標名)[下標表示式1][下標表示式2]...;
動態建立上面的二維陣列的正確寫法如:
int (*p)[3]; // 宣告乙個指向陣列的指標
p = new int[2][3]; // 動態建立二維陣列
可以按照下面的形式訪問此二維陣列的元素:
for (int i=0; i<2; i++)
}二.繼承自c語言的動態記憶體分配與釋放的函式
c++語言除了可以使用new和delete運算子進行動態記憶體管理外,還繼承了c語言的動態記憶體管理函式。
1.動態記憶體分配函式
void *malloc(size);引數size是要分配的位元組數。函式執行成功時返回void型別的指標,執行失敗時返回空指標null。
2.動態記憶體釋放函式
void free(void *memblock);引數memblock是指向要釋放的記憶體的指標。此函式沒有返回值。
C和指標 動態記憶體分配
void malloc size t size 分配所需的記憶體空間,並返回乙個指向它的指標。記憶體塊的大小,以位元組為單位。void calloc unsigned int num,unsigned int size 功能 在記憶體的動態儲存區中分配num個長度為size的連續空間,函式返回乙個指...
C 陣列 指標 動態記憶體分配
includeusing namespace std void print int n,int a 10 cout int main print 3,k 傳入二維陣列的首位址 另外函式定義時也可以這樣定義 void print int n,int a 10 代表a是乙個指向二維陣列的指標 和一維陣列...
C和指標詳解 動態記憶體分配
malloc和free malloc和free分別用於執行動態記憶體分配和釋放。這些函式維護乙個可用記憶體池。當乙個程式另外需要一些記憶體時,它就呼叫malloc函式,malloc從記憶體池中提取一塊合適的記憶體,並向該程式返回乙個指向這塊記憶體的指標。當一塊以前的記憶體不再使用時,程式呼叫free...