C++(三) 对内存中堆、栈、静态存储区的理解

  堆:由程序员自己分配释放(用malloc和free,或new和delete) ,如果我们不手动释放,那就要到程序结束才释放。如果对分配的空间在不用的时候不释放而一味的分配,那么可能会引起内存泄漏,其容量取决于虚拟内存,较大。

  栈:由编译器自动分配释放,其中存放在主调函数中被调函数的下一句代码、函数参数和局部变量,容量有限,较小。

  静态存储区:由在编译时由编译器分配,由系统释放,其中存放的是全局变量、static变量和常量.

  区别:

    1)堆是由低地址向高地址扩展,栈是由高地址向低地址扩展。

            2)堆是不连续的空间,栈是连续的空间。

            3)在申请空间后,栈的分配要比堆的快。对于堆,先遍历存放空闲存储地址的链表、修改链表、再进行分配;对于栈,只要剩下的可用空间足够,就可分配到,如果不够,那么就会报告栈溢出。

            4)栈的生命期最短,到函数调用结束时;静态存储区的生命期最长,到程序结束时;堆中的生命期是到被我们手动释放时(如果整个过程中都不手动释放,那就到程序结束时)。

            5)举例:

                            void fun()

                           {

                              char *ptr="abcdefg"; //指针变量ptr存在栈空间, 字符串常量"abcdefg”存在静态存储区

                              char arr[]="abcdef";  //字符数组变量arr(其值"abcdef")存在栈空间

                              char cha1='x';            //字符变量cha1存在栈空间

                              char cha2='y';            //字符变量cha2存在栈空间

                              char *p_char1 ;        //字符指针变量p_char1存在栈空间

                              char *p_char2;        //字符指针变量p_char2存在栈空间

                               p_char1 = arr;       //p_char1指向栈空间

                              p_char2=(char*)new char[10]; //分配10字节的堆空间,p_char2指向这块堆空间

                            }

 

               注意:在申请到堆空间,用完之后要及时释放,以免引起内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值