vc内存分配方法与比较

来源:互联网 发布:林疯狂七场数据 编辑:程序博客网 时间:2024/05/17 01:24

VC内存分配

GlobalAlloc、new、malloc、HeapAlloc

      1、GlobalAlloc() 

GlobalAlloc()主要用于Win32应用程序实现从全局堆中分配出内存供程序使用,是16位WINDOWS程序使用的API,对应于系统的全局栈,返回一个内存句柄,在实际需要使用时,用GlobalLock()来实际得到内存 区。但32位WINDOWS系统中全局栈和局部堆的区别已经不存在了,因此不推荐在Win32中使用该函数,应使用新的内存分配函数HeapAlloc()以得到更好的支持,GlobalAlloc()还可以用,主要是为了 兼容。
从本质上,如果我们不调用GlobalReAlloc函数,我们就可以用HeapAlloc代替GlobalAlloc。

2、HeapAlloc() 

HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的 空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是 局部。

使用HeapAlloc分配的内存有两点和GlobalAlloc不同: 

1)、不可以移动,所以可能会产生内存碎片 
      2)、可以提供串行化访问功能,多线程时不用自己再同步了

3、malloc() 
      malloc()是C运行库中的动态内存分配函数,主要用于ANSI C程序中,是标准库函数。WINDOWS程序基本不再使用这种方法进行内存操作,因为它比WINDOWS内存分配函数少了一些特性,如整理内存。 

4、new 
       标准C++一般使用new语句分配动态的内存空间,需要申请数组时,可以直接使用new int[3]这样的方式,释放该方法申请的内存空间使用对应的delete语句,需要释放的内存空间为一个数组,则使用delete [] ary;这样的方式。 
要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问. 
new在内部调用malloc来分配内存,delete在内部调用free来释放内存。 

它们之间的区别主要有以下几点:

1、GlobalAlloc()函数在程序的堆中分配一定的内存,是Win16的函数,对应于系统的全局栈,而在Win32中全局栈和局部堆的区别已经不存在了,因此不推荐在Win32中使用该函数。

2、malloc()是标准库函数,而new则是运算符,它们都可以用于申请动态内存。

3、new()实际上调用的是malloc()函数。

4、new运算符除了分配内存,还可以调用构造函数,但是malloc()函数只负责分配内存。

5、对于非内部数据类型的对象而言,只使用malloc()函数将无法满足动态对象的要求,因为malloc()函数不能完成执行构造函数的任务。

6、malloc(); 和 HeapAlloc(); 都是从堆中分配相应的内存,不同的是一个是c run time的函数,一个是windows系统的函数, 对于windows程序来说,使用HeapAlloc();会比malloc();效率稍稍高一些。

0 0
原创粉丝点击