GlobalAlloc()和malloc()、HeapAlloc()

两者都是在堆上分配内存区。 
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.

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。

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

GlobalAlloc()和malloc()、HeapAlloc()

时间: 2024-11-08 05:29:33

GlobalAlloc()和malloc()、HeapAlloc()的相关文章

HeapAlloc、GlobalAlloc和new等内存分配有什么区别么?

查找了一些 new , GlobalAlloc, HeapAlloc分配内存方式的区别. 转了一些资料 //===========================================================// 下面是资料1: 1. GlobalAlloc函数和new()的区别.       1>new是标准的C++分配内存函数.GlobalAlloc是WIN下的API函数.    2>new分配内存同时会调用类等对象的构造函数.GlobalAlloc不回.    3>

malloc 函数工作机制(转)

malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节).接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上.调用free函数时,它将用户释放的内存块连接到空闲链上.到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空

Windows平台下主要的内存管理途径

new / delete   malloc / free    CoTaskMemAlloc / CoTaskMemFree    IMalloc::alloc / IMalloc/free    GlobalAlloc / GlobalFree    LocalAlloc / LocalFree    HeapAlloc / HeapFree    VirtualAlloc / VirtualFree VirtualAlloc以页面为单位(4K)进行分配,是操纵虚拟内存的底层函数. HeapA

Windows内存小结

以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低2G用户空间, 高2G内核空间是所有程序共享的.高2G内核空间中, 属于同一Session的程序又共享相同的session空间: x86系统所有的内存以64K边界粒度, 4K页面大小分配. 用户态的内存空间,按用途分可以分为: image, mapped file, heap, stack, fre

Windows内存小结(有好多图,比较清楚)

以前写过一篇理解程序内存, 当时主要是针对用户态,下面再稍微深入一点: 我们以32位程序为例(不启用AWE), 总共4G虚拟空间,其中低2G属于用户态, 高2G属于操作系统内核, 每个程序都有自己的低2G用户空间, 高2G内核空间是所有程序共享的.高2G内核空间中, 属于同一Session的程序又共享相同的session空间: x86系统所有的内存以64K边界粒度, 4K页面大小分配. 用户态的内存空间,按用途分可以分为: image, mapped file, heap, stack, fre

Win32

day01 Windows 编程 1 Windows 编程基础 2 WIndows 字符 3 窗口处理 4 消息 5 绘图 6 对话框 7 控件 ... 一Windows 编程基础 1 Windows 应用程序的类型 1.1 控制台程序Console DOS 程序.本身没有窗口,通过Windows 的DOS 窗口执行. 1.2 窗口程序 拥有自己的窗口,可以与用户交互. 1.3 库程序 存放代码.数据的程序,执行文件可以从中 取出代码执行和获取数据. 1.3.1 动态库 扩展名DLL,在执行文件

内存分配(malloc,new,VirtualAlloc,HeapAlloc,GlobalAlloc,LocalAlloc)区别与注意

malloc()头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的.)功能:分配长度为num_bytes字节的内存块说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. C运行库中的动态内存分配函数,主要用于ANSI C(C语言的标准)程序中,是标准库函数.WINDOWS程序基本不再使用这种方法进行内存操作,

关于内存的5个函数(malloc,VirtualAlloc,GlobalAlloc,LocalAlloc,HeapAlloc)

VirtualAlloc 该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0 一次分配 1PAGE 以上的 RAM. 每次分配都是 PAGE 的整数倍. 你不会想为了分配 1 个 BYTE 的空间而浪费剩下的 4095 字节. OK, 你可以自己写算法, 多分配几 PAGE. 然后每次分配少量数据时就从那几 PAGE 中划分出来. KERNEL32 提供了一个解决办法, 用 HeapAlloc/Global

HeapAlloc,GlobalAlloc,LocalAlloc,VirtualAlloc,malloc,new的异同

1. 首先我们来看HeapAlloc:MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连 续的空间能满足分配的大小,程序不能将其他零散的 空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是 局部.函数原型为:LPVOIDHeapAlloc(    HANDLE hHeap,    DWORD dwFlags,   SIZE_T dwBytes    );h