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()。