1,malloc與free是c++/c語言的標準庫函式,1. malloc()函式1.1 malloc的全稱是memory allocation,中文叫動態記憶體分配。 說明:malloc 向系統申請分配指定size個位元組的記憶體空間,返回型別是 void* 型別。void* 表示未確定型別的指標。c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。 備註:void* 表示未確定型別的指標,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...) 1.3 free void free(void *firstbyte): 該函式是將之前用malloc分配的空間還給程式或者是作業系統,也就是釋放了這塊記憶體,讓它重新得到自由。 1.4注意事項1)申請了記憶體空間後,必須檢查是否分配成功。 2)當不需要再使用申請的記憶體時,記得釋放;釋放後應該把指向這塊記憶體的指標指向null,防止程式後面不小心使用了它。 3)這兩個函式應該是配對。如果申請後不釋放就是記憶體洩露;如果無故釋放那就是什麼也沒有做。釋放只能一次,如果釋放兩次及兩次以上會出現錯誤(釋放空指標例外,釋放空指標其實也等於啥也沒做,所以釋放空指標釋放多少次都沒有問題)。 4)雖然malloc()函式的型別是(void *),任何型別的指標都可以轉換成(void *),但是最好還是在前面進行強制型別轉換,因為這樣可以躲過一些編譯器的檢查。 1.5 malloc()到底從**得到了記憶體空間? 答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。 2. new運算子 2.1 c++中,用new和delete動態建立和釋放陣列或單個物件。 動態建立物件時,只需指定其資料型別,而不必為該物件命名,new表示式返回指向該新建立物件的指標,我們可以通過指標來訪問此物件。 int *pi=new int; 這個new表示式在堆區中分配建立了乙個整型物件,並返回此物件的位址,並用該位址初始化指標pi 。 2.2 動態建立物件的初始化 動態建立的物件可以用初始化變數的方式初始化。 int *pi=new int(100); //指標pi所指向的物件初始化為100 string *ps=new string(10,'9');//*ps 為「9999999999」 如果不提供顯示初始化,對於類型別,用該類的預設建構函式初始化;而內建型別的物件則無初始化。 也可以對動態建立的物件做值初始化: int *pi=new int( );//初始化為0 int *pi=new int;//pi 指向乙個沒有初始化的int string *ps=new string( );//初始化為空字串 (對於提供了預設建構函式的類型別,沒有必要對其物件進行值初始化) 2.3 撤銷動態建立的物件 delete表示式釋放指標指向的位址空間。 delete pi ;// 釋放單個物件 delete [ ]pi;//釋放陣列 如果指標指向的不是new分配的記憶體位址,則使用delete是不合法的。 2.4 在delete之後,重設指標的值 delete p; //執行完該語句後,p變成了不確定的指標,在很多機器上,儘管p值沒有明確定義,但仍然存放了它之前所指物件的位址,然後p所指向的記憶體已經被釋放了,所以p不再有效。此時,該指標變成了懸垂指標(懸垂指標指向曾經存放物件的記憶體,但該物件已經不存在了)。懸垂指標往往導致程式錯誤,而且很難檢測出來。 一旦刪除了指標所指的物件,立即將指標置為0,這樣就非常清楚的指明指標不再指向任何物件。(零值指標:int *ip=0;) widget *pw1 = new widget;// 分配失敗丟擲std::bad_alloc if (pw1 == 0) ... // 這個檢查一定失敗 widget *pw2 = new (nothrow) widget; // 若分配失敗返回0 if (pw2 == 0) ... // 這個檢查可能會成功 3. malloc和new的區別 3.1 new 返回指定型別的指標,並且可以自動計算所需要大小。比如:1) 2) 3.2 malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。 除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指標,在其它操作上保持一致。 4.有了malloc/free為什麼還要new/delete? 1) 2) 3)new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。
2,對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
3,因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
4,c++程式經常要呼叫c函式,而c程式只能用malloc/free管理動態記憶體。
5、new可以認為是malloc加建構函式的執行。new出來的指標是直接帶型別資訊的。而malloc返回的都是void指標。
一:new delete 是運算子,malloc,free是函式
malloc與free是c++/c語言的標準庫函式,new/delete是c++的運算子。它們都可用於申請動態記憶體和釋放記憶體。
對於非內部資料型別的物件而言,光用maloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。
因此c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new,以及乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。
malloc和free的實現
被人問到malloc和free的實現問題。我們知道malloc的呼叫形式如 type p type malloc n sizeof type free的呼叫形式如 free p 好了,問題來了,free函式,我們只給傳入乙個指標,沒有傳入記憶體塊的大小n,那麼編譯器怎麼知道要釋放多少位元組的記憶體,...
malloc函式和free函式
c語言中的動態記憶體分配函式malloc和free使用起來很靈活,但是也很容易導致錯誤,如果知道了malloc和free的實現原理,那麼,出錯的機會就很小了。malloc的實現原理 作業系統維護了乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,作業系統沿鍊錶尋找乙個大...
malloc與free和new delete的區別
不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析構函式。由於malloc free 是庫函式...