您現在的位置是:首頁 >生活 > 2023-08-08 08:24:10 來源:
malloc和new的區別(malloc)
大家好,我是小華,我來為大家解答以上問題。malloc和new的區別,malloc很多人還不知道,現在讓我們一起來看看吧!
1、一.malloc基本知識 原型:extern void *malloc(unsigned int num_bytes); 用法:#include 或#include 功能:分配長度為num_bytes字節的內存塊 說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
2、 當內存不再使用時,應使用free()函數將內存塊釋放。
3、 malloc的語法是:指針名=(數據類型*)malloc(長度),(數據類型*)表示指針. malloc()函數的工作機制 malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閑鏈表。
4、調用malloc函數時,它沿連接表尋找一個大到足以滿足用戶請求所需要的內存塊。
5、然后,將該內存塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。
6、接下來,將分配給用戶的那塊內存傳給用戶,并將剩下的那塊(如果有的話)返回到連接表上。
7、調用free函數時,它將用戶釋放的內存塊連接到空閑鏈上。
8、到最后,空閑鏈會被切成很多的小內存片段,如果這時用戶申請一個大的內存片段,那么空閑鏈上可能沒有可以滿足用戶要求的片段了。
9、于是,malloc函數請求延時,并開始在空閑鏈上翻箱倒柜地檢查各內存片段,對它們進行整理,將相鄰的小空閑塊合并成較大的內存塊。
10、 舉例: // malloc.c #include #include main() { char *p; clrscr(); // clear screen p=(char *)malloc(100); if(p) printf("Memory Allocated at: %x",p); else printf("Not Enough Memory! "); free(p); getchar(); return 0; } 二.TCMalloc:線程緩存的Malloc(了解) 作者:Sanjay Ghemawat, Paul Menage 三.new和malloc的區別 new 是c++中的操作符,malloc是c 中的一個函數 2、new 不止是分配內存,而且會調用類的構造函數,同理delete會調用類的析構函數,而malloc則只分配內存,不會進行初始化類成員的工作,同樣free也不會調用析構函數 3、內存泄漏對于malloc或者new都可以檢查出來的,區別在于new可以指明是那個文件的那一行,而malloc沒有這些信息。
11、 4、new 和 malloc效率比較 new 有三個字母, malloc有六個字母 new可以認為是malloc加構造函數的執行。
12、 new出來的指針是直接帶類型信息的。
13、 而malloc返回的都是void指針。
14、 對于非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。
15、對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。
16、由于malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加于malloc/free。
17、 因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以及一個能完成清理與釋放內存工作的運算符delete。
18、注意new/delete不是庫函數。
19、 我們先看一看malloc/free和new/delete如何實現對象的動態內存管理,見下面示例。
20、 class Obj { public : Obj(void){ cout << “Initialization” << endl; } ~Obj(void){ cout << “Destroy” << endl; } void Initialize(void){ cout << “Initialization” << endl; } void Destroy(void){ cout << “Destroy” << endl; } }; void UseMallocFree(void) { Obj *a = (obj *)malloc(sizeof(obj)); // 申請動態內存 a->Initialize(); // 初始化 //… a->Destroy(); // 清除工作 free(a); // 釋放內存 } void UseNewDelete(void) { Obj *a = new Obj; // 申請動態內存并且初始化 //… delete a; // 清除并且釋放內存 } 類Obj的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功能。
21、函數UseMallocFree中,由于malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成初始化與清除工作。
22、函數UseNewDelete則簡單得多。
23、 所以我們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。
24、由于內部數據類型的“對象”沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。
25、 既然new/delete的功能完全覆蓋了malloc/free,為什么C++不把malloc/free淘汰出局呢?這是因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。
26、 如果用free釋放“new創建的動態對象”,那么該對象因無法執行析構函數而可能導致程序出錯。
27、如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出錯,但是該程序的可讀性很差。
28、所以new/delete必須配對使用,malloc/free也一樣。
本文到此講解完畢了,希望對大家有幫助。