c/c++ 堆与栈 malloc/free与new/delete

c++中内存分为5个区,分别是堆,栈,自由存储区,全局/静态存储器和常亮存储区

栈,就是有编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,里面的变量通常是局部变量,函数参数等

堆,就是那些有new分配的内存块,他们的释放编译器不去管,有我们的应用程序去控制,一般一个new就要对应一个delete,如果程序员没有释放掉,那么在程序借宿后,操作系统会自动回收

自由存储区,就是那些有malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的

全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的c语言中,全局变量又分为初始化和未初始化(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void* 来访问和操纵,程序结束后由系统自行释放),在c++里面没有这个分区了,他们共同占用同一块内存区

常量存储区,这是一块特殊的存储区,他们里面存放的是常量,不允许修改(当然你要是通过非正当手段也可以修改)




堆和栈的区别

管理方式不用:对于栈来讲,是有编译器自动管理,无需我们手工控制;对于堆来说,释放工作有程序员控制,容易产生内存泄漏

空间大小:一般来讲是32位系统下,堆内存可以达到4g空间,从这个角度来看堆内存几乎是没有什么限制的,但是对于栈来说,一般都是有一定的空间大小的

碎片问题:对于堆来说,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片是的程序的效率降低,对于栈来说,不存在这个问题,因为栈是先进后出的队列,他们是如此一一对应,以至于永远不可能有一个内存块从栈中间弹出来,在他弹出之前,在他上面的后进的栈内容已经被弹出,

生长方向:对于堆来说,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,他的方向是向下的,是向着内存地址减小的方向增大

分配方式:堆都是动态分配的,没有静态分布的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配,动态分配由malloc函数进行分配,但是栈的动态分配是和堆不同的,他的动态分配是有编译器进行释放,无需我们手工实现

分配效率:堆的效率比栈要低的多




malloc/free 与new/delete的区别

相同点:都可以申请动态内存和释放内存

不同点:

操作对象不同:malloc/free是c/c++的标准库函数,new/delete是c++的运算符。

用法不同:函数mallcoc原型 void * malloc(size_t size)

                         用malloc申请一块长度为length的整数类型的内存:int *p=(int* )malloc(sizeof(int)*length);

                         1:malloc 返回值为void*。所以在调用malloc时要显式的进行类型转换,将void*转换成所需要的指针类型

                          2:malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数

                     函数free的原型是 void free(void* memblock)


new建立的是一个对象,malloc分配的是一块内存

new可以认为是malloc加构造函数的执行,new出来的指针是直接带类型信息的,而malloc返回的都是void*指针,new delete在实现上其实是调用了malloc,free的函数

对于非内部数据类型的对象而言,用malloc/free无法满足动态对象的要求,对象在创建的用时要自动执行构造函数,对象在消亡之前要自动执行析构函数,而malloc/free是库函数不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free,因此c++语言需要一个能完成动态分配和初始化工作的运算符new,和一个能完成清理与释放内存工作的运算符delete


                       

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值