operator new、malloc、HeapAlloc分配内存有何不同?

导读:
  operator new、alloc、HeapAlloc都是在堆(heap)中分配内存,跟栈(stack)没有关系,new 和 alloc分配内存的方式应该是一样的,所以用alloc分配的空间可以用delete释放,而用new分配的空间也可以用free释放,不同的是,用delete在释放内存前还会调用析构函数,所以用new创建的最好还是用delete释放。
  另外,HeapAlloc和HeapFree必须搭配使用,因为HeapAlloc分配的内存空间,delete和free不能正确释放,new、malloc分配的空间也不能被HeapFree正确处理 .
  
  
  C++将内存划分为三个内存区:
  1:静态存储区,主要存放全局变量和用用static定义的变量,这部分内存在程序编译时刻已经
  分配好,并且在整个程序运行期间都存在。
  2:在栈(stack)创建内存,一般用于存放局部变量或对象, 这部分主要是程序运行期间,定义的临时对象,调用函数时在函数内部定义的变量,比如
  fun()
  {
  int i;// 栈上创建
  }
  当结束临时对象的生命期时,或者调用函数结束时,在栈上创建的对象,会被系统自动回收
  这就是为什么我们
  定义 int i;
  或者 class A;A a;
  不会产生内存泄露的原因,因为系统自动回收了这部分内存。
  在栈上创建对象的好处是:栈内存分配运算内置于处理器的指令集
  中,效率很高,但是分配的内存容量有限。
  3:在堆(heap)创建对象,主要是用户通过调用new/delete或者malloc/free来创建销毁对象
  好处是:用户可以根据自己要求创建内存大小,非常灵活。
  缺点是:这部分内存必须有用户自己来销毁,也就是这部分最容易造成内存泄露。执行速度相对于在栈上的速度要慢。
  例子说明
  int iTemp(10);// 静态存储区
  static char chTemp[] = "test";//静态存储区
  int fun (int i)
  {
  int j = i;//j,i都是在栈上创建
  cout <
  ruturn j*2;// 返回值是在栈上创建
  }
  int fun1()// 以下是错误定义,仅为说明问题
  {
  int *p = new int(10);//堆上创建
  int *p1 = (int*)malloc (sizeof(int));//堆上创建
  return (*p);
  }
  int main()
  {
  int itemp;//栈上创建
  int *p = new int(10);//堆上创建
  int *p1 = (int*)malloc (sizeof(int));//堆上创建
  }
  还有把new 和delete 与malloc 和free 混在一起用也是个坏想法。对一个用new
  获取来的指针调用free,或者对一个用malloc 获取来的指针调用delete,其后
  果是不可预测的
  原因是:new是C++的操作符,用new可以创建class对象,可以申请适合class对象大小的内存
  并可以执行class的构造函数,创建类对象,用delete时,不但可以销毁new的内存,并且还可以
  对class对象,调用析购函数,释放class申请的资源。如果用是class对象,用new申请,用free
  释放,会有什么发生那?free只是释放内存空间,并没有析购class对象,也就是说对象并没有
  被销毁,造成内存泄露。
  如果用malloc申请,用delete释放那,理论上来说是没有问题的,但是我想谁也不乐意这么做。
  还有使用new和malloc,一定要和delete和free成对出现、要注意防止内存泄露。
  当然如果你用STL的auto_ptr可以不用显示delete,由系统帮你delete。
  
  
  Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1485757

本文转自
http://blog.csdn.net/mobidogs/archive/2007/01/17/1485757.aspx
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值