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。

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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法时空

STL里的容器区别

小结 我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,...

29440
来自专栏伟大程序猿的诞生

Android的JNI【实战教程】1⃣️--java和c/c++的那些事

JNI在Android和c/c++中起着重要的作用,就相当于桥梁。你知道抗日时候为啥要先炸桥梁就知道JNI在其中的重要性了。

32160
来自专栏诸葛青云的专栏

C语言编程中的“堆”和“栈”七大不同之处

对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等。初学开发过程中往往让人混淆不清。今天我们来谈谈堆和栈的...

20520
来自专栏流川疯编写程序的艺术

windows linux—unix 跨平台通信集成控制系统----系统硬件信息获取

控制集成系统需要了解系统的各项硬件信息,之前我们设计的时候,习惯使用c函数来搞,后来可能发现程序的移植性收到了一些影响,比如unix内核的一些c函数在linux...

13030
来自专栏Nicky's blog

Java编写的C语言词法分析器

    这是java编写的C语言词法分析器,我也是参考很多代码,然后将核心代码整理起来,准备放在QQ空间和博客上,目的是互相学习借鉴,希望可以得到高手...

25120
来自专栏流川疯编写程序的艺术

leetcode 155 Min Stack

Design a stack that supports push, pop, top, and retrieving the minimum element ...

12120
来自专栏业余草

流程图的画法说明和部分详解

最近项目开发,公司部分人走掉了。3、4月份求职高峰期。找来的新人,由我带领,讲解业务相当麻烦,而且还需要每个人都讲解一遍。因此我就结合现有的功能画了流程图和序列...

56220
来自专栏用户2119464的专栏

字节跳动EE部门前端面试经历及总结

你好,我是星辉,幸会幸会。 今天下午我参加了字节跳动EE部门的前端视频第一次面试,把它记录总结下来,希望能够对大家带来帮助。

1.5K20
来自专栏机器人课程与技术

如何快速学会单片机编程并应用?

C51--(Arduino、MSP430)--(2812、28335)--(STM32、ARM9)--(TK1、BeagleBone、Raspberry Pi)

26610
来自专栏ACM算法日常

leetcode 9 | 回文数 (两种不同的解决方式)

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

35930

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励