• 您現在的位置是:首頁 >生活 > 2023-08-08 08:24:10 來源:

    malloc和new的區別(malloc)

    導讀 大家好,我是小華,我來為大家解答以上問題。malloc和new的區別,malloc很多人還不知道,現在讓我們一起來看看吧!1、一.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也一樣。

    本文到此講解完畢了,希望對大家有幫助。

  • 成人app