globalalloc、malloc和new的区别

news/2024/7/20 15:58:08 标签: 内存管理, 运维, c/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。

 

 

 

转载于:https://www.cnblogs.com/wdpp/archive/2011/02/23/2386810.html


http://www.niftyadmin.cn/n/1389548.html

相关文章

Visual Studio Code源码编译最完整解决方案

简介&#xff1a; 1.Visual Studio Code&#xff08;以下简称vscode&#xff09;是一个轻量且强大的代码编辑器&#xff0c;支持Windows&#xff0c;OS X和Linux。内置JavaScript、TypeScript和Node.js支持&#xff0c;而且拥有丰富的插件生态系统&#xff0c;可通过安装插件来…

【NetDIY应用开发-01】Hello world

2019独角兽企业重金招聘Python工程师标准>>> 我们在NetDIY智能主控板上编写第一个应用程序。 下面是主控板照片&#xff1a; NetDIY智能主控板USB接口为Micro USB&#xff0c;和当下手机的USB接口一致&#xff0c;很方便我们调试。 NetDIY智能主控板的参数详…

http://www.cnblogs.com/sufei/

苏飞转载于:https://www.cnblogs.com/Garden-blog/archive/2011/02/24/1963879.html

vue加了scoped反而导致样式不起作用了?

加scoped不就是为什么了保障样式不会乱一个.vue文件里的样式不会受其它文件样式的影响么为什么偏偏会有一个.vue文件里加了scoped反而导致这里面的样式不起作用了是可能是什么原因呢 发现问题了是因为我的内容是调接口获取的html通过v-html绑定的可能是进入页面的时候先加载的样…

第一次java学习

第一次JAVA学习&#xff08;动力节点老杜的课程&#xff09;&#xff08;2020.9.12&#xff09; 1.dos命令窗口&#xff1a;复制操作&#xff0c;win10&#xff0c;左键选中&#xff0c;右键点击一下&#xff0c;直接复制 2.cd命令切换目录&#xff1a;change directory&#x…

手机游戏运营主要的指标是什么? 7天活跃, 14天活跃 ARPU ?如何提升游戏 app 的虚拟道具的收入?...

数据采集越细&#xff0c;手段越丰富&#xff0c;所获得的数据也就更加详实&#xff0c;虽然手机游戏没有网游那么复杂&#xff0c;但也需要数据化运营&#xff0c;而且是必要的&#xff0c;是优化游戏收入的关键&#xff0c;大家最主要关心的是下面三类数据的指标1. 用户数量首…

Javascript中大括号“{}”的多义性

摘要&#xff1a;本文主要介绍JavaScript中大括号有四种语义作用。JS中大括号有四种语义作用 语义1&#xff0c;组织复合语句,这是最常见的 if( condition ) {//... }else {//... } for() {//... }语义2&#xff0c;对象直接量声明 var obj {name : jack,age : 23 };整个是个…

chrome浏览器解决跨域请求SameSite方案

在chrome浏览器地址栏输入chrome://flags并回车 在搜索栏中输入SameSite by default cookies搜索&#xff0c;并禁用如图中的两项设置 &#xff0c;改为Disabled即可 点击右下键ReLaunch重启浏览器即可