16,472
社区成员
发帖
与我相关
我的任务
分享
//创建
hUserBuf = VirtualAlloc(NULL, dwUserBufferSize,MEM_COMMIT, PAGE_READWRITE);
//销毁
VirtualFree( hUserBuf, dwUserBufferSize, MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
hUserBuf1 = VirtualAlloc(NULL, dwUserBufferSize1,MEM_COMMIT, PAGE_READWRITE);
hUserBuf2 = VirtualAlloc(NULL, dwUserBufferSize2,MEM_COMMIT, PAGE_READWRITE);
...
//创建
hUserBuf = VirtualAlloc(NULL, dwUserBufferSize,MEM_COMMIT, PAGE_READWRITE);
//销毁
VirtualFree( hUserBuf, dwUserBufferSize, MEM_DECOMMIT );
VirtualFree( hUserBuf, 0, MEM_RELEASE);
LPBYTE pD1 = (LPBYTE)VirtualAlloc(0,10,MEM_COMMIT,PAGE_READWRITE);
//虽然只分配了10字节,但其实是分配了4K物理内存,因为CPU页是4K
pD1[4095] = 5; //所以可以读写第4096字节
// pData[4096] = 1; //读写4K+1处,就报错了
//pD2只占虚拟究竟不占物理空间
LPBYTE pD2 = (LPBYTE)VirtualAlloc(0,10,MEM_RESERVE,PAGE_READWRITE);
TRACE("pD1 addr = %08x\n",UINT(pD1));//因为分配粒度是64K
TRACE("pD2 addr = %08x\n",UINT(pD2));//第二次分配的地址,没什么意外的话,会是pD1+64K
//只保留虚地址未申请物理地址的,读写会报错
// pD2[0] = 4;
//真正申请物理地址,才可读写
VirtualAlloc(pD2,10,MEM_COMMIT,PAGE_READWRITE);
pD2[0] = 4;
//释放P1的物理与虚拟内存
VirtualFree(pD1,0,MEM_RELEASE);
// pD1[4095] = 5; //释放后再读写则报错
//只释放物理内存,未释放虚拟内存
VirtualFree(pD2,0,MEM_DECOMMIT);
// pD2[0] = 1; //读写释放了物理内存的,会报错.
//重新分配物理内存
VirtualAlloc(pD2,1,MEM_COMMIT,PAGE_READWRITE);
pD2[100] = 4; //重新分配物理内存后,又可以读写了
//真正物理与虚地址都释放
VirtualFree(pD2,0,MEM_RELEASE);
// pD2[100] = 5; //不能再读写了
class MyCls{
public:
MyCls(){iVal = 10;}
private:
int iVal;
};
int main()
{
int i;
PBYTE pData = (PBYTE)VirtualAlloc(0, //让系统自动选空闲地址
3 * 1024 * 1024, // size of region
MEM_COMMIT, //申请物理内存
PAGE_READWRITE); //保护模式
if (NULL == pData) {
TRACE("申请内存失败!"); return 0;
}
int* pInt = (PINT)pData; //如果是一般的数据,直接指向即可使用
for (i=0;i<1024;i++)
{
pInt[i] = i+1;
}
//如果是类,不能简单指向,还要执行构造函数,就要定位new,C++Primer上有教
MyCls* pMyCls = new(pData+4*1024) MyCls[10]; //主要是这个定位new