WTL 内存申请和释放

         通常来说,内存申请和释放都不是问题。使用 new 和delete 两个操作符就可以了。如果要认真研究windows操作系统的内存分配机制,情况就变的复杂了,甚至一本书都很难说明白。这方面我也只是略知一二,并没有专门进行过研究。

         以我个人的看法,只有了解了几个问题,就可以应付了。如果你有兴趣并且有时间的话,专门研究一下更好。windows在执行一个exe程序的时候,会单独为这个程序建立一个进程,同时它还会为这个进程分配一个4G的内存空间--堆(当然另外还有一个1M栈用于存放临时变量,专递参数)。-- 其实我并不是很确切知道上面的理解是否正确,我希望差不多跟实质不冲突就可以了。

        内存管理方面的常见的函数有一下面几组:

        1.  malloc与free

      2. new与delete

      3.  HeapAlloc和 HeapFree

      4. GlobalAlloc和GlobalFree

        5. LocalAlloc 和 LocalFree

      6. VirtualAlloc和 VirtualFree


      下面我们分别来说明他们的用法:

      malloc 是C语言的库函数,来到C++之后,它基本就可以退出舞台了。new作为系统内置的操作符, 除了完成malloc相同的功能,在面向对象的编程中,new 申请内存的同时,还调用了对象的构造函数,同时delete也调用了析构函数。malloc语句组没有后面的功能。 

      所以在WTL编程中,你可以忘掉malloc和free,正常情况下,只使用new和delete就可以了。

     下面的地址,是一个叫叶明的网友,讲到了管理内存问题,一共六篇文章,讲的很仔细。我没有完全引用那个文章的内容,使因为讲的过于复杂之后,反而让人有点无从选择。从程序员的角度说,还是明白什么时候使用那组函数,如果能大致量化的话,就更好。

   http://blog.csdn.net/yeming81/article/details/2052311
   

     当我们一次性申请一块大的内存块,这个值我想订在512k,那么应该使用 VirtualAlloc 和 VirtualFree 这组函数。比如: 

   char  *pBuf = new  char[512*1024];
  

    这时候,我们应该使用下面的代码:

   char *pBuf= (char*)VirtualAlloc(NULL,512*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READWRITE); 

      使用虚拟内存这组函数的原因在于与new不同,VirtualAlloc 只是通知系统保留内存空间,而不是实际分配了512k内存。只有实际用到那块内存(按页处理), 才会为那块内存分配实际的物理内存。这对于超大数组来说,简直就是福音。至于虚拟内存的真正用法,大家自己查吧,这已经不是重点了。

      HeapAlloc和 HeapFree, 其实在VC++内部,new操作符就是调用了这组函数,从根本上讲,这组函数式根本的。每个进程会有一个缺省的堆,你也可以建立建立一个自己的堆,有的时候,你请求内存的时候不希望遭遇内存溢出的时候,你可以专门为这个对象建立一个堆。 ::HeapCreate 函数用于建立一个堆。    

GlobalAlloc和LocalAlloc 是16位时代的产物,微软的文档里明确表示申请内存时候,应该使用 HeapAlloc和 HeapFree 函数。只是在兼容某些操作,如剪切板和数据交换的时候,才会用到GlobalAlloc。


     

      


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值