`
isiqi
  • 浏览: 16367223 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

1. 首先我们来看HeapAlloc:
MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的 空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是 局部。函数原型为:
LPVOID
HeapAlloc(
HANDLE hHeap,
DWORD dwFlags,
SIZE_T dwBytes
);
hHeap是进程堆内存开始位置。
dwFlags是分配堆内存的标志。包括HEAP_ZERO_MEMORY,即使分配的空间清零。
dwBytes是分配堆内存的大小。
其对应的释放空间函数为HeapFree。
2. 再看GlobalAlloc:该函数用于从全局堆中分配出内存供程序使用,函数原型为:
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
uFlags参数含义
GHND GMEM_MOVEABLE和GMEM_ZEROINIT的组合
GMEM_FIXED 分配固定内存,返回值是一个指针
GMEM_MOVEABLE 分配活动内存,在Win32中,内存块不能在物理内存中移动,但能在默认的堆中移动。返回值是内存对象的句柄,用函数GlobalLock可将句柄转化为指针
GMEM_ZEROINIT 将内存内容初始化为零
GPTR GMEM_FIXED和GMEM_ZEROINIT的组合
一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块 内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。如下: lpMem=GlobalLock(hMem); 这样应用程序才能存取这块内存。所以我们在使用GlobalAllock时,通常搭配使用GlobalLock,当然在不使用内存时,一定记得使用 GlobalUnlock,否则被锁定的内存块一直不能被其他变量使用。
GlobalAlloc对应的释放空间的函数为GlobalFree。
3. LocalAlloc:该函数用于从局部堆中分配内存供程序使用,函数原型为:
HLOCAL LocalAlloc(
UINT uFlags,
SIZE_T uBytes
);
参数同GlobalAlloc。
在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局 堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而 LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存。
由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。
而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。而且一旦发生严重错误,可能会影响到整个系统的稳定。
不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。应用程序也不可能直接访问系统内存。所以在Win32中全局堆和局部堆都 指向进程的省缺堆。用LocalAlloc/GlobalAlloc分配内存没有任何区别。甚至LocalAlloc分配的内存可以被 GlobalFree释放掉。所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于 HeapAlloc(GetProcessHeap(),...)。
LocalAlloc对应的释放函数为LockFree。
4. VirtualAlloc:该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0;其函数原型:
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize, // size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
VirtualAlloc可以通过并行多次调用提交一个区域的部分或全部来保留一个大的内存区域。多重调用提交同一块区域不会引起失败。这使得一个应用程 序保留内存后可以随意提交将被写的页。当这种方式不在有效的时候,它会释放应用程序通过检测被保留页的状态看它是否在提交调用之前已经被提交。
VirtualAlloc对应的释放函数为VirtualFree。
5.Malloc:malloc与free是C++/C语言的标准库函数,可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是 库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
6.New:new/delete是C++的运算符。可用于申请动态内存和释放内存。C++语言需要一个能完成动态内存分配和初始化工作的运算符new, 以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。C++程序经常要调用C函数,而C程序只能用malloc /free管理动态内存。new 是个操作符,和什么"+","-","="...有一样的地位.
malloc是个分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.
malloc需要头文件库函数支持.new 建立的是一个对象,
malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

分享到:
评论

相关推荐

    申请内存区别new malloc HeapAlloc VirtualAlloc

    `new`, `malloc`, `HeapAlloc`, 和 `VirtualAlloc`都是用于在程序中动态分配内存的常见方法,但它们之间存在明显的区别和使用场景。理解这些差异有助于优化程序性能和避免内存泄漏。 首先,`new`是C++中的运算符,...

    程序最多能new多少内存

    HeapAlloc的调用顺序是HeapAlloc->new->VirtualAlloc->malloc。malloc是C语言的申请内存方法,也是最底层的申请内存方法。HeapAlloc的申请内存速度之所以比new快,是因为HeapCreate创建了一段连续可用的内存。 在...

    VC函数(API,VC常用内存分配函数等)

    标题和描述中提到的`HeapAlloc`、`GlobalAlloc`和`LocalAlloc`是Windows API中用于动态内存分配的函数,它们在VC++编程中尤为常见。下面将详细介绍这些函数以及相关的知识点。 1. **HeapAlloc**: 这个函数属于...

    Win32(File/Thread/HeapAlloc)等小例子

    与C++的`new`操作符不同,`HeapAlloc`提供了一种更底层的方式来控制内存分配。另外,还有`HeapFree`函数用于释放由`HeapAlloc`分配的内存。合理使用内存管理可以帮助避免内存泄漏,提高程序的稳定性和效率。 4. **...

    《对话框》之《内存分配方式和调试机制》

    其次,Windows传统的全局或局部内存分配函数,如GlobalAlloc和LocalAlloc,它们在Win32中与Win16保持兼容,但本质上功能相同,只是名称上的差异。这些函数允许开发者分配任意大小的内存,受限于可用的物理内存。 ...

    内存分配问题与调试机制

    其次,Windows传统全局或局部内存分配函数,如GlobalAlloc和LocalAlloc,它们在Win32下虽然名称不同,但功能基本相同,主要用于分配任意大小的内存,仅受限于物理内存。这些函数是为了保持与Win16系统的兼容性而保留...

    微软TechED2010 侯捷讲座《Windows内存管理与定址》PPT

    讲座从应用程序的角度出发,介绍了一系列用于动态分配内存的工具和方法,包括但不限于Win32 API中的`HeapAlloc`、`VirtualAlloc`等函数,以及C/C++语言中提供的`malloc`、`free`、`new`等关键字或函数。 ##### 2. ...

    内存分配方式和调试机制.doc

    其次,Windows传统的全局或局部内存分配函数,如GlobalAlloc和LocalAlloc,它们在Win32下与Win16版本兼容,尽管在平面内存结构下功能相似,但仍然提供了便利性。 C语言的标准内存分配函数,包括malloc、calloc、...

    Windows应用程序中内存管理API函数

    5. **GlobalAlloc**:类似于LocalAlloc,但GlobalAlloc分配的内存可以在所有线程间共享,而不仅仅是当前线程。使用GlobalLock和GlobalUnlock来锁定和解锁内存,以便进行读写操作。 6. **GlobalFree**:与...

    让vc6支持new 抛出异常

    在C++编程中,`new`操作符用于动态分配内存,而`throw`关键字与异常处理密切相关。在标准C++中,当`new`尝试分配内存但失败时,它会自动抛出一个`std::bad_alloc`异常。然而,对于较老的编译器如Visual C++ 6.0...

    WindowsAPI函数存储管理.rar_内存管理_内存管理函数

    7. **malloc**和**free**:虽然不是原生Windows API,但C标准库中的这些函数在Windows环境中也可用,用于动态内存分配和释放。它们与Windows API中的内存管理函数有所不同,但常常被C和C++程序员使用。 了解并熟练...

    windows API函数大全

    5. **内存管理**:GlobalAlloc、LocalAlloc和VirtualAlloc函数分配内存,而GlobalFree、LocalFree和VirtualFree则用于释放内存。 HeapAlloc和HeapFree是与进程相关的内存管理函数。 6. **线程和进程**:...

    Noobi:一个执行Shellcode的简单工具,能够检测鼠标移动

    能够检测鼠标移动特征: 通过检测鼠标移动并检查硬件资源来逃避沙盒如果在10秒钟内鼠标光标没有移动,它将自行终止如果CPU内核小于2,而RAM小于2048,则会自行终止使用HeapAlloc而不是VirtualAlloc 动态API解析字符...

    c++源码讲述132个WinAPI函数和206个完整实例

    4. **内存管理**:GlobalAlloc、LocalAlloc、VirtualAlloc、HeapAlloc等函数处理内存分配和释放。 5. **进程线程**:CreateProcess、CreateThread、ExitThread等函数用于创建和控制进程和线程。 6. **文件和I/O**:...

    WIN32内存管理笔记 .ZIP_C 内存管理_win32_win32程序

    - 使用`LocalAlloc`和`GlobalAlloc`进行小块内存分配可能比直接使用堆更高效。 - 尽量减少内存碎片,保持内存分配和释放的顺序一致性。 10. **调试工具**: - WinDbg、Visual Studio Debugger等工具可帮助开发者...

    WIN32API功能150个(内存篇)

    8. **LocalAlloc**和**LocalFree**:与GlobalAlloc类似,但这些函数在进程的局部内存中进行操作,适用于线程私有的内存分配。 9. **CreateFileMapping**和**MapViewOfFile**:这两个API组合在一起可以创建一个映射...

    WINDOWSAPI.rar_WindowsAPI

    5. **内存管理**:Windows API 提供了动态内存分配和释放的函数,如malloc、free、HeapAlloc和HeapFree。此外,GlobalAlloc和LocalAlloc则用于全局和局部内存的分配。 6. **文件操作**:CreateFile、ReadFile和...

    pageheap内存越界检测

    PageHeap.Exe将针对某个指定的应用程序启用Page Heap标志,从而自动监视所有的malloc、new和heapAlloc的内存分配,找出内存错误。

    WIN32编程

    5. **内存管理**:在WIN32编程中,使用GlobalAlloc、LocalAlloc等函数分配内存,HeapAlloc使用堆内存,VirtualAlloc则涉及虚拟内存的管理。FreeMemory、GlobalFree、HeapFree等函数用于释放内存。 6. **文件操作**...

Global site tag (gtag.js) - Google Analytics