动态内存分配的几个函数:GlobalAlloc()、HeadpAlloc()、new()、malloc()

 1.  new/delete

new和delete是C++中的运算符(而非函数),用于动态分配和撤销内存

new用法:

1> 开辟单变量地址空间

1)new int;  //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new

int 即为将一个int类型的地址赋值给整型指针a. 

2)int *a = new int(5) 作用同上,但是同时将整数赋值为5

2>开辟数组空间

一维: int *a = new int[100];开辟一个大小为100的整型数组空间

 一般用法: new 类型 [初值]

delete用法:

1> int *a = new int;

delete a;   //释放单个int的空间

 2>int *a = new int[5];

delete [] a; //释放int数组空间

2. malloc()/free()

原型:void * malloc(size_t size);

头文件:#include <malloc.h>或#include <stdlib.h>

功能:malloc 向系统申请分配指定size个字节的内存空间。返回值是 void* 类型的指针。(C,C++规定,void* 类型可以强制转换为任何其它类型的指针)

返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL;

当内存不再使用时,应使用free()函数将内存块释放;

malloc()和new的区别:

(1)new操作符返回指定类型的指针,并且可以自动计算所需要大小。比如:

int *p;

p = new int;          //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

malloc()则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。

int* p;
p = (int *) malloc (sizeof(int));

注意:malloc()函数的实参为sizeof(int),用于指明一个整型数据需要的大小,否则会出现错误;

(2)new操作符可以自动调用被创建对象的构造函数,是面向对象语言的标志性使用之一,delete操作符也可以自动调用对象的析构函数;

而malloc()/free()函数是C语言中的产物,不能自动调用对象的构造函数和析构函数。

3. GlobalAlloc()/GlobalFree()

(使用很少,为了配合系统某些API函数中的内存句柄才会使用)

调用GlobalAlloc()函数分配一块内存,该函数会返回分配的内存句柄;调用GlobalFree函数来释放内存块,必须传给该函数一个内存句柄。

GlobalAlloc()函数原型:

HGLOBAL WINAPI GlobalAlloc(
  __in          UINT uFlags,
  __in          SIZE_T dwBytes
);

说明:分配一个全局内存块

返回值:如果成功,返回全局内存句柄;如果失败,返回NULL

参数类型及说明:

uFlags:对分配的内存类型进行定义的常数标志,如下所示: 

GMEM_FIXED 分配一个固定内存块

GMEM_MOVEABLE 分配一个可移动内存块

GMEM_ZEROINIT 新分配的内存块全部初始化成零

GHND 分配可移动、并初始为0的内存块(相当于GMEM_ZEROINIT+GMEM_MOVEABLE)

GPTR 分配固定、并初始化为0的内存块(相当于GMEM_ZEROINIT+GMEM_FIXED)

dwBytes Long:要分配的字符数 

GlobalAlloc()函数和new()的区别
  1>new是标准的C++分配内存函数。GlobalAlloc()是WIN下的API函数。 
  2>new分配内存同时会调用类等对象的构造函数。GlobalAlloc()不会。 
  3>new分配的内存只能同进程使用,如(A进程new,B进程不能delete),GlobalAlloc()能多进程使用,并删除。 

GlobalAlloc()和HeapAlloc()的关系
  GlobalAlloc()是win16留下来的函数,它调用HeapAlloc()分配堆中的内存。在理想的win32环境下,我们不需要GlobalAlloc,但是实际上,我们还得保留从win16移植过来的许多代码。在这些代码中使用了“内存句柄”(HGLOBAL)参数而不是32位的内存地址。

GlobalAlloc()根据其属性参数做两件不同的事情。如果参数指定了GMEM_FIXED,则GlobalAlloc()简单调用HeapAlloc(),把返回地址作为一个32位HGLOBAL值;如果参数指定了GMEM_MOVEABLE,则返回的HGLOBAL值是一个指向进程里句柄表中某一项入口的指针,该入口包含指向实际HeapAlloc分配的内存的指针。   

从本质上,如果我们不调用GlobalReAlloc函数,我们就可以用HeapAlloc()代替GlobalAlloc()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值