程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> globalalloc、malloc和new的區別

globalalloc、malloc和new的區別

編輯:關於C++

GlobalAlloc

是為了與Win16兼容才保留的,在Win32下不要使用。 全局內存對象使用GlobalAlloc函數分配,在 Windows 3.X的時代,分配的內存可以有兩種,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的時代這些函數已 經被廢棄了,現在的內存只有一種就是虛存。在Win32中所有的進程所使用的內存區域是相互隔離的,每個進程都擁有自己的地 址空間。而且系統使用了頁面交換功能,就是利用磁盤空間來模擬RAM,在RAM中數據不使用時將會被交換到磁盤,在需要時將會 被重新裝入RAM。

兩者都是在堆上分配內存區。

malloc

是C運行庫中的動態內存分配函數,WINDOWS程序基本不 使用了,因為它比WINDOWS內存分配函數少了一些特性,如,整理內存。

GlobalAlloc()是16位WINDOWS程序使用的API,返回 一個內存句柄,在實際需要使用時,用GlobalLock()來實際得到內存區。但,32位WINDOWS系統中,應使用新的內存分配函數 HeapAlloc()以得到更好的支持,GlobalAlloc()還可以用,主要是為了兼容。

HeapAlloc apply memory from kernel32.dll  

GlobalAlloc obsolete malloc   apply memory form C runtime   memory ,and C r untime applys         from    kernel32.dll  

new a wrapper of malloc but it is NOT a must for new to implement

based on malloc.  

CoMemAlloc apply memory from kernel32.dll

all are heap memory.

recommend HeapAlloc for big block memory allocation

recommend stack memory space.
recommend HeapAlloc for big block memory allocation

recommend stack memory space.

malloc與free是C++/C語言的標准庫函數

new/delete是C++的運算符

它們都可用於申請動態內存和 釋放內存。

對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造 函數,對象在消亡之前要自動執行析構函數。由於malloc/free是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執 行構造函數和析構函數的任務強加於malloc/free。

因此C++語言需要一個能完成動態內存分配和初始化工作的運算符new,以 及一個能完成清理與釋放內存工作的運算符delete。注意new/delete不是庫函數。

我們先看一看malloc/free和new/delete如 何實現對象的動態內存管理,見示例7-8。

class Obj{     
   public :
   Obj(){ cout << “Initialization” << endl; } 
   ~Obj(){ cout << “Destroy” << endl; }
   void Initialize(){ cout << “Initialization” << endl; }
   void Destroy(){ cout << “Destroy” << endl; }
};
void UseMallocFree(){
   Obj *a = (obj *)malloc(sizeof(obj)); // 申請動態內存
   a->Initialize();                     // 初始化
   //…
   a->Destroy(); // 清除工作
   free(a);      // 釋放內存
}
void UseNewDelete(){
   Obj *a = new Obj; // 申請動態內存並且初始化
   //… 
   delete a;         // 清除並且釋放內存
}

示例7-8 用malloc/free和new/delete如何實現對象的動態內存管理

類Obj的函數Initialize模擬了構造函數 的功能,函數Destroy模擬了析構函數的功能。函數UseMallocFree中,由於malloc/free不能執行構造函數與析構函數,必須調 用成員函數Initialize和Destroy來完成初始化與清除工作。函數UseNewDelete則簡單得多。

所以我們不要企圖用 malloc/free來完成動態對象的內存管理,應該用new/delete。由於內部數據類型的“對象”沒有構造與析構的過程,對它們而 言malloc/free和new/delete是等價的。

既然new/delete的功能完全覆蓋了malloc/free,為什麼C++不把malloc/free淘汰出 局呢?這是因為C++程序經常要調用C函數,而C程序只能用malloc/free管理動態內存。

如果用free釋放“new創建的動態對象 ”,那麼該對象因無法執行析構函數而可能導致程序出錯。如果用delete釋放“malloc申請的動態內存”,理論上講程序不會出 錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。

全局內存對象使用GlobalAlloc函數分 配,在Windows 3.X的時代,分配的內存可以有兩種,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的時代這些函 數已經被廢棄了,現在的內存只有一種就是虛存。在Win32中所有的進程所使用的內存區域是相互隔離的,每個進程都擁有自己 的地址空間。而且系統使用了頁面交換功能,就是利用磁盤空間來模擬RAM,在RAM中數據不使用時將會被交換到磁盤,在需要時 將會被重新裝入RAM。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved