`
king_tt
  • 浏览: 2258415 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

globalalloc、malloc和new的区别

 
阅读更多

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。

示例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。

分享到:
评论

相关推荐

    C++内存分配秘籍—new,malloc,GlobalAlloc详解

    在这篇文章中,我们将深入探讨三种主要的内存分配方式:new、malloc 和 GlobalAlloc。 首先,让我们了解内存分配的三种基本类型: 1. 静态存储区域分配:这部分内存包含全局变量和静态变量,它们在程序启动时分配...

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

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

    Windows下动态内存分配方式

    - 对于常规的内存分配和释放,malloc和free或C++的new和delete通常是首选,因为它们易于使用且跨平台。 - 如果处理的是Windows特有的任务,可能需要用到Heap Memory API。 - 考虑到兼容性和移植性,避免使用...

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

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

    C++内存分配

    #### 二、详解new,malloc,GlobalAlloc ##### 1. new 和 delete `new`和`delete`是C++中用于动态分配和释放内存的关键字。它们的主要用法如下: - **开辟单个变量地址空间**: - `int *a = new int;`:分配一个`...

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

    而`new`和`delete`则是C++特有的操作符,它们不仅分配和释放内存,还能处理对象的构造和析构。 在实际开发中,了解并合理使用这些函数可以有效避免内存泄漏,提高程序性能。同时,掌握内存管理的基本原则,如何时...

    程序运行时内存分配.doc

    在Windows平台和其他系统中,还有一些特定的内存分配函数,如`GlobalAlloc()`、`CoTaskMemAlloc()`等,它们用于不同的内存管理场景。 内存分配的效率和正确性对于程序的性能和稳定性至关重要。不当的内存管理可能...

    VB中的指针技术

    1. **动态内存分配**:VB的`New`运算符用于创建对象实例,但并不直接提供像C++那样使用`malloc`或`calloc`进行动态内存分配的函数。然而,通过API调用如`GlobalAlloc`和`LocalAlloc`,可以实现类似的功能。 2. **...

    MFC中需要释放资源的UI操作总结

    15. **Strings**:MFC中的字符串通常使用 `CString` 类,它会自动管理内存,但在使用 `new` 或 `malloc` 分配的字符串需要手动 `delete` 或 `free`。 了解以上知识,开发者可以更好地管理MFC程序中的资源,防止资源...

    VC++获取IP地址、托盘图标及剪贴板相关操作

    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (lstrlen(pszText) + 1) * sizeof(TCHAR)); if (hGlobal) { LPTSTR lptstrText = (LPTSTR)GlobalLock(hGlobal); if (lptstrText) { _tcscpy_s(lptstrText, ...

Global site tag (gtag.js) - Google Analytics