malloc,new,heapAlloc,virtualAlloc

malloc,new,heapAlloc,virtualAlloc

(1) VirtualAlloc

PVOID VirtualAlloc(PVOID pvAddress, SIZE_T dwSize, DWORD fdwAllocationType, DWORD fdwProtect)

VirtualAlloc是Windows提供的API,通常用来分配大块的内存。例如如果想在进程A和进程B之间通过共享内存的方式实现通信,可以使用该函数(这也是较常用的情况)。不要用该函数实现通常情况的内存分配。该函数的一个重要特性是可以预定指定地址和大小的虚拟内存空间。例如,希望在进程的地址空间中第50MB的地方分配内存,那么将参数 50*1024*`1024 = 52428800 传递给pvAddress,将需要的内存大小传递给dwSize。如果系统有足够大的闲置区域能满足请求,则系统会将该块区域预订下来并返回预订内存的基地址,否则返回NULL。

使用VirtualAlloc分配的内存需要使用VirtualFree来释放。

这个API主要跟系统的虚拟内存相关

在进程的内存空间,申请一段内存空间,称之为保留,使用VirtualAlloc

PVOID VirtualAlloc(
   PVOID pvAddress,
   SIZE_T dwSize,
   DWORD fdwAllocationType,

   DWORD fdwProtect);

会经历   MEM_RESERVE和MEM_COMMIT两个阶段,也就是第三个参数,reserve状态,并没有真正向物理存储器提交,commit之后才是真正提交到物理存储器,才会分配真正的物理内存。
假设想实现一个电子表格应用程序,这个电子表格为2 0 0行x 256列。对于每一个单元格,都需要一个C E L L D ATA结构来描述单元格的内容。若要处理这种二维单元格矩阵,最容易的方法是在应用程序中声明下面的变量:
CELLDATA CellData[200][256];
如果C E L L D ATA结构的大小是1 2 8字节,那么这个二维矩阵将需要6 553 600(200 x 256 x1 2 8)个字节的物理存储器。对于电子表格来说,如果直接用页文件来分配物理存储器,那么这是个不小的数目了,尤其是考虑到大多数用户只是将信息放入少数的单元格中,而大部分单元格却空闲不用,因此显得有些浪费。内存的利用率非常低。
传统上,电子表格一直是用其他数据结构技术来实现的,比如链接表等。使用链接表,只需要为电子表格中实际包含数据的单元格创建C E L L D ATA结构。由于电子表格中的大多数单元格都是不用的,因此这种方法可以节省大量的内存。但是这种方法使得你很难获得单元格的内容。如果想知道第5行第1 0列的单元格的内容,必须遍历链接表,才能找到需要的单元格,因此使用链接表方法比明确声明的矩阵方法速度要慢。
虚拟内存为我们提供了一种兼顾预先声明二维矩阵和实现链接表的两全其美的方法。运用虚拟内存,既可以使用已声明的矩阵技术进行快速而方便的访问,又可以利用链接表技术大大节省内存的使用量。
【详见windows核心编程 – 内存管理-第15章:在应用程序中使用虚拟内存】

(2) HeapAlloc

HeapAlloc是Windows提供的API,在进程初始化的时候,系统会在进程的地址空间中创建1M大小的堆,称为默认堆(Default Heap),该大小为默认值,可以通过/HEAP连接器开关进行修改。用户也可以通过HeapCreate创建额外的堆,堆的使用可以更有效的进行内存管理,避免线程同步的开销以及快速的释放内存等。HeapAlloc用于从堆上分配一个内存块,如果分配成功则返回内存块的地址。HeapAlloc内部会根据请求的大小以及堆的大小来决定具体的实现,例如在需要大的内存空间时,会自动调用VirtualAlloc函数分配空间。该函数通常用来分配一般大小的内存空间,一些Windows API可能会要求使用该函数进行内存分配并传递给API参数。注意,在分配大的内存块时(例如1M或者更多)最好避免使用堆函数,建议使用VirtualAlloc。

使用HeapFree释放由HeapAlloc的分配的内存。

(3) malloc

C语言的内存分配函数,用于分配一般的内存空间,该函数分配的内存不会自动进行初始化。如果使用C语言编程,使用该函数。在Visual C++ 中,malloc函数会调用HeapAlloc函数。

malloc分配的内存由free函数释放。

(4) new

C++语言的实现方式,在Visual C++ 中,通过调用HeapAlloc实现内存分配,如果使用C++编程,建议使用new进行一般内存的分配。系统根据调用的方式决定是否对对象进行初始化。

注意: new 在C++中实际上是操作符而不是函数。

使用new 分配的内存由delete / delete[] 进行释放


引用自:http://www.seanyxie.com/mallocnewheapallocvirtualalloc/

另参考:http://www.cnblogs.com/CBDoctor/archive/2013/02/20/2918456.html

mallocnew都是用于在内存中分配空间的函数,但它们有一些不同之处。 mallocC语言中的函数,用于分配指定大小的内存块。它的使用方式是通过调用malloc函数并传入所需的内存大小来分配内存。例如,使用malloc分配一个包含10个int元素的数组可以这样写:int *ptr = (int *)malloc(sizeof(int) * 10); \[1\] new是C++中的运算符,用于在堆上分配内存并调用对象的构造函数。它的使用方式是通过使用new运算符并指定要分配的类型来分配内存。例如,使用new分配一个A类型的对象可以这样写:A *ptr = new A; \[2\] 需要注意的是,malloc分配的内存需要手动释放,而new分配的内存会在对象销毁时自动释放。此外,new还可以调用对象的构造函数,而malloc只是分配内存而不会调用构造函数。 另外,malloc和free函数C语言中的函数,不允许重载。而new和delete运算符是C++中的运算符,可以通过重载来自定义它们的行为。 总结起来,mallocnew都可以用于在内存中分配空间,但mallocC语言中的函数new是C++中的运算符。它们的使用方式和行为有一些不同,需要根据具体的需求来选择使用。 #### 引用[.reference_title] - *1* *2* *3* [newmalloc 区别 笔记](https://blog.csdn.net/qq_42394290/article/details/108587614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值