一.malloc函式(memory allocation) 中文名:動態記憶體分配
原型:extern void *malloc(unsigned int num_bytes);
說明:分配長度為num_bytes位元組的記憶體塊,分配成功,則返回指向該記憶體塊的指標。否則指向null空指標,使用free()釋放
1.1void *malloc (int size);
說明:向系統申請長度為size的記憶體,返回型別是void*型,但是可以強制轉換成其他型別的指標。
也就是說當你申請記憶體的時候,系統還不知道你用這段記憶體儲存什麼型別的資料。
1.2 free()
void free(void *firstbyte):該函式的意義是將之前分配給malloc的記憶體還給程式或者作業系統。釋放記憶體
1.3注意事項
1.申請了記憶體之後必須檢查是否分配成功
2.當不需要使用時,記得釋放,釋放之後記得把指向該記憶體的指標只想null,免得不小心使用
3.這兩個函式必須配對,如果申請後不釋放就是記憶體洩露,如果無故釋放那就是這塊記憶體什麼也沒做
4.雖然maloc函式型別是void*,任何型別的指標都可以轉換成void*,但是最好還是在前面加上強制型別轉換,因為這樣可以躲過編譯器的檢查。
1.4 malloc()到底是從**得到了記憶體空間?
答案是從堆裡面,也就是說函式返回的指標是指向堆裡面的一塊記憶體,作業系統裡面有乙個記錄空閒記憶體的的鍊錶,當作業系統收到記憶體請求之後,就會遍歷該鍊錶,然後找到第乙個記憶體比所申請的記憶體要大的堆節點,然後將堆節點刪除,並將該記憶體分配給程式
二.new 運算子
2.1 c++中,用new和delete來動態建立和釋放物件或者陣列
用new動態建立物件時,只需指定其資料型別,而不必為該物件命名,new表示式返回物件的位址,可通過指標訪問此物件
2.2 動態建立物件的初始化
動態建立的物件可以用初始化變數的方式初始化
int *pi=new int(10); 初始化為10
string *ps=new string(10,'9'); 初始化為10個9
如果不提供顯示初始化,那麼用預設建構函式初始化,而內建型別的物件就不初始化
int *pi=new int(); 初始化為零
int *pi=new int; 沒有初始化
string *ps=new string();初始化為空字串(因為存在預設建構函式)
2.3刪除動態建立的物件
delete 表示式釋放指標指向的位址空間
delete pi; 釋放單個物件
delete pi; 釋放陣列
如果指標使用的不是new申請的記憶體,那麼使用delete是不合法的
2.4在delete之後,重設指標的值
delete p; 之後,p變成了不確定的指標,在很多機器上,儘管p值沒有明確定義,但仍然存放了他之前所指物件的位址,但是p所指向的記憶體已經被釋放了,所以p不再有效,此時該指標變成了懸垂指標(懸垂指標:指向曾經存放物件的位址,但是物件已經不存在了),懸垂指標往往導致程式錯誤,而且很難檢測出來,一旦刪除了指標所指的物件,立刻將指標置為零,這樣就非常清楚地指明指標不再指向任何物件了(int *p=0;).
2.5區分零值指標和null指標?
零值指標,是值為零的指標,可以是任何一種指標的型別,可以是通用變體型別 void*也可以是 char*,int *等等(int *pi=0;)
空指標,其實空指標只是一種程式設計概念,是人為地認為指標不提供任何位址訊息(c++中空指標指向了0位址)
2.6new分配失敗時,返回的是什麼?
2023年之前,c++記憶體分配失敗後返回0,但是現在要求丟擲operator new丟擲 std::bad_alloc異常,但是很多c++程式是在編譯器開始支援新規範寫的,c++標準委員會不想放棄那些已有的遵循返回0規範的**,所以她們提供了另外形式的operator new以及operator new以繼續提供返回0功能,這些形式被稱為無丟擲,他們沒用過throw,而是在使用new的入口點採用了nothrow物件
三.malloc和new的區別
(1)new返回指定型別的指標,並且可以自動計算所需要的大小
但是malloc必須有我們來計算位元組數,並且返回的是void*指標,必須通過強制轉換成我們需要的型別的指標
(2)new分配的物件可以通過預設建構函式或初始化的方法來進行物件的初始化
malloc只管記憶體分配,並不能對記憶體進行初始化,所以得到的值是隨機的
(3)new/delete是c++運算子
malloc/free是c++/c語言的標準庫函式
(4)對於非內部資料而言,光用malloc/free無法滿足動態物件的要求,因為很多物件建立時自動執行建構函式,物件在消亡之前要自動執行析構函式,但是malloc/free是庫函式,不是運算子,不在編譯器控制許可權之內,所以不能把建構函式和析構函式的任務強加給malloc/free;
但是new是可以完成動態記憶體分配和初始化的運算子,delete是完成清理和釋放記憶體的運算子,不是庫函式
注意:不要企圖用malloc/free來完成動態物件的記憶體管理,應用new/delete;但是對於內部資料型別物件是沒有建構函式,析構函式的,所以malloc/free和new/delete是沒有區別的。
四.既然new/delete功能這麼強大,為什麼不把malloc/free代替了?
因為c++程式經常要呼叫c函式,但是c程式只能用malloc/free來管理動態記憶體。
五.為什麼new/delete和malloc/free必須配對使用?
因為用free釋放new建立的物件,物件就會不能執行析構函式而出錯,用delete刪除malloc申請的動態記憶體,結果也會導致程式出錯,並且程式的可讀性很差,所以必須使用new/delete,malloc/free配對使用
new和malloc的區別
1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...
malloc和new的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...
new 和 malloc 的區別
new 和 malloc 的區別 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...