首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++的new和VirtualAlloc有些分不清,该怎么处理

2012-03-27 
c++的new和VirtualAlloc有些分不清new是从堆中申请内存VirtualAlloc是直接从虚拟内存里面拿。这里我就糊涂

c++的new和VirtualAlloc有些分不清
new是从堆中申请内存
VirtualAlloc是直接从虚拟内存里面拿。

这里我就糊涂了。

new从堆里面申请的内存也属于虚拟内存的管理范畴吗?
我的意思就是说。

1,如果ram只有256m,swap有1g。
我new一个300m的内存,多出的部分内存也会从swap里面申请吗,还是直接抛出异常说内存不足?

2,这两者用起来有何特点,貌似书只是说,new是小数据用,virtualalloc是给大数据结构用的。不理解

[解决办法]
new 只要你系统的内存还够用,都是在内存里的,不够的话 依标准会抛异常

操作系统如果发现物理内存不够用,会将部分内存调到硬盘上,使用的时候再调回来(换页)
virtualalloc 分配的则统统先保存到硬盘上,使用的时候调入内存

[解决办法]
vc的new最后走的是HeapAlloc(RtlAllocateHeap)
如果堆的空间还够就在用户模式从里面划分一块给你,否则调用NtAllocateVirtualMemory分配一块虚拟内存并入堆中
[解决办法]
实际上new调的malloc,Windows上malloc调的HeapAlloc,HeapAlloc最后调的VirtualAlloc。

VirtualAlloc只能以比较大的单位(最小4KB)申请内存。HeapAlloc可以申请任意大小的内存。malloc基本上可以视为直接调用HeapAlloc(只是基本上)。new在调用malloc之后,如果是类会调用构造函数。

热点排行
Bad Request.