扩展阅读
  • 我想动态申请一块内存,然后在释放这块内存,应该怎么做,在线等!
  • 内存映射设备后,就可以直接访问设备的片内内存 了(比如显卡的显存)?
  • 我执行top命令,显示出来所有进程占内存都不超过1%,可是512M内存只剩30多M,为什么?
  • 用top命令查看一个进程,虚拟内存一直不变,但物理内存每时5s增长12k或20k.
  • 应用层malloc内存后,再free的话,内存不释放,而是在exit时释放,这个谁知道是怎么回事?
  • 如何让linux没有到达内存瓶颈时回收内存页并占用最少资源
  • 泄漏了的内存会算在该程序占用的内存总量里面吗
  • 内存占用率达到 109% ,到底占用了多少内存?
  • 在Linux上用C语言编写的函数里面申请了一块内存,并且返回这块内存,最终它需要释放吗?
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • 我在hp服务器上装了个sco unixware7.1.3 但是内存是8G 但是我用命令查看内存
  • 内核最大可用内存是多少,怎样扩大可用内存?
  • 32位地址空间指的是虚拟内存的寻址范围,但是为什么要求物理内存大小不能大于4G?
  • 哪些内存范转是DOS占用,哪些内存是空闲的
  • 在SUSE linux下jar文档的运行,提示内存泄露,指定最大最小内存后只能在十几分钟才能打开,求各位大虾指点!
  • 求救:AIX下java进程堆内存存在大量空余,但rss内存不断增加
  • solaris 8 下有没有返回系统总物理内存和当前所使用内存大小的函数。(不是top,vmstat命令)
  • 大家好,我想问下有人用过"linux进程的内存使用解析"中推荐使用的"Ben Maurer写的perl脚本"查看内存么
  • 扩充内存和扩展内存什么区别,我概念不清,谁给讲讲啊
  • DMA中从内存传输到内存源和目的地址怎么设
  •  
    当前位置:  编程语言>c/c++

    c/c++内存堆分配和栈分配理解

     
        发布时间:2013-9-2  


        本文导语: C/C++ 内存模型 1、栈区:由编译器自动分配和释放,存放函数的参数数值,局部变量的值 其操作方式类似于数据结构中的栈。 2、堆区: 一般由用户分配和释放,若用户不释放,程序结束时候由OS回收...

    c/c++ 内存模型

     1、栈区:由编译器自动分配和释放,存放函数参数数值,局部变量的值  

          其操作方式类似于数据结构中的

     2、堆区: 一般由用户分配和释放,若用户不释放,程序结束时候由OS回收。

           它与数据结构中堆是两回事,分配方式类似链表

     3、全局区(静态区):static 全局变量静态变量的存放区域。

       初始化的全局变量和静态变量在一块区域。

       未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

       程序结束后由系统释放。

     4、文字常量区: 常量字符串就是放在这里的。程序结束后由系统释放。

     5、程序代码区:存放函数体的二进制代码。

    C/C++ 和栈的区别

    1、管理方式不同:栈由编译器管理;堆由程序员管理。

    2、空间大小不同:win32中,堆可达4GVC中栈默认1M(可以修改)。

    3、碎片问题:堆易产生;栈不会。

    4、生长方向不同:堆生长方向是向上的,也就是向着内存增加的方向;栈相反。

    5、分配方式不同:堆是动态的,没有静态的堆;栈有两种:动态和静态。

    6、分配效率不同:栈,系统提供底层支持,有专门的寄存器存放栈地址,效率高;堆,由库函数提供支持,效率底。

    C/C++ 堆和栈的理解

    stack

    由系统自动分配。只要栈的剩余空间大于所申请的空间,系统将为程序提供内存吗,否则将异常提示溢出

    windows 下,栈是向 低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的。

    在windows下,栈的大小是2M(不知道是否正确) 总之是一个编译时就确定的常数。如果申请的空间超过栈的剩余空间,将提示overflow

    栈由系统自动分配,速度快。但用户无法控制的。

    heap:

    需要用户自己申请。在C中malloc函数 char *p1=(char*)malloc(10);C++ 中用new操作符。但是指针本身是在栈中

    首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表。寻找第一个空间大于所

    申请的空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存

    空间中的首地址的首地址处记录本次分配的大小。这样,代码中的Detele语句才能正确的释放内存空间。另外,由于找到的堆节点的大小

    不一定正好等于申请的的大小,系统会自动的将多余的部分重新空闲链表中。

    堆是是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址,自然不是连续的。而链表的遍历方向是由低向高地址。堆的大小受限于计算机系统中的有效的虚拟内存。

    堆是由 new 分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

    代码举例

    int a = 0; //全局初始化区
    char *p1; //全局未初始化区
    main()
     {
         int b; //栈
        char s[] = "abc"; //栈
         char *p2; //栈
         char *p3 = "123456"; //123456在常量区,p3在栈上。
         static int c = 0; //全局(静态)初始化区
         p1 = (char *)malloc(10);
         p2 = (char *)malloc(20);
         //分配得来得10和20字节的区域就在堆区。
         strcpy(p1, "123456");
         //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一块。
     }


    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:c/c++内存堆分配和栈分配理解
    相关文章推荐:
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 我的机器内存128 ,安装redhat9 后,可用内存很少了,如何节省内存呢?
  • C/C++内存池实现介绍及基本要求
  • 奇闻:Apache+Apache JServ 1.1.1+1G内存居然报内存不够,那位高友知道参数设置,把俺的1G内存都利用起来,感激不尽啊
  • linux下free命令显示的内存使用情况分析
  • 怎样读取指定内存地址处指定长度的内存数据???(
  • Ubuntu查看内存,进程相关命令介绍
  • pci内存地址,pci I/O地址和系统内存地址的关系?
  • Linux 共享内存介绍及实现代码
  • 【操作系统虚拟内存和物理内存疑惑】
  • Linux内存文件系统(ramdisk)的三种实现方式
  • Solaris下如何获得物理内存和虚拟内存的大小?
  • Microsoft IE MSHTML内存破坏远程代码执行漏洞
  • 程序需要共享内存相当大,但是系统的内存有限
  • Microsoft Internet Explorer内存破坏漏洞(CNVD-2013-13096)
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • linux下进程占用内存空间详解
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况
  • c/c++服务器程序内存泄露问题分析及解决
  • 遇到奇怪的内存泄露问题,应用程序杀死内存无法释放!
  • linux内存文件系统ramfs实现原理
  • linux中程序内存泄露如何界定呢?这样算内存泄露吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3