C++内存管理——C++内存分类

原创 2007年09月30日 13:36:00

 C++内存管理——内存分类

MoaKap

    在编写程序过程中,程序员必须清楚程序内存的分配机制,合理进行内存管理,这样才能得到高效的程序。同时,如果对C++内存分配基本概念不理解,使用不当,一方面浪费了宝贵的内存资源,降低了程序运行效率,另一方面还会造成程序中意想不到的错误。

C++程序中,把内存分为4类,程序存储区、静态数据存储区、运行时栈、自由存储区或堆

1、  程序存储区

包含所有函数及成员函数的机器指令。函数一旦被编译,即被编译为特定得机器指令,存放在程序存储区。当程序运行时,从内从中读取并执行指令。

这部分内存不允许更改,在一般情况下,指针不会指向内存代码段中的位置。但也有特殊,如指向函数的指针,其指向即为程序存储区存放该函数的机器指令的位置。

2、  静态数据存储区

此段存放所有的全局变量,以及由static修饰符声明的任意局部变量、或类数据成员。

其中全局变量是指在函数或类作用域之外定义的变量,通过赋值或构造函数初始化。在main函数开始执行之前,完成对全局变量的初始化。

像全局变量一样,static定义的变量同样只需分配一次内存,而且要在main开始执行之前对其进行初始化,且每个名字只能分配一个值。之后该变量将一直存在直到运行结束。

3、  运行时栈

运行时栈是指程序运行时使用的栈,使用栈来保存程序运行过程中的一些系统指针。

例如,调用函数时存储参数和返回地址的指针。当要调用函数时,程序先将这返回地址指针压栈,然后程序跳转至调用函数执行,函数返回后从栈中弹出位置指针找到调用函数前的位置,以便继续执行接下来的指令。

运行时栈 还用来为函数中的参数、局部变量分配内存,待函数返回时从栈中释放内存,允许下一次函数调用重用该内存块。

运行时栈可以实现内存的重用,增加了内存使用效率,但使用栈存储局部变量有两个主要缺点:

A、 栈内存值的生存期取决于函数的开始和结束。即函数返回时,栈中的值就不存在了。因此,任何返回局部变量地址的操作都是不允许的。

B、 栈为局部变量分配内存时,必须已知变量要占用的内存空间的大小。

4、  自由存储区或堆

在不能预知对象大小的情况下,就不能使用栈内存。例如在不知道数组包含的元素数的情况下,就不能使用栈未数组分配内存。

此时,就需要动态存储分配。

堆(自由存储区)存储由运算符new显式申请空间的大小。

例如:  在函数中有   Employee * boss = new Employee”Lin, Lisa”,68000;

上面的语句声明了存储在栈中的名为boss的指针变量。指针的值指向存储在堆中的数据域。 其中boss变量存放在栈空间中,指针指向的数据则存放在堆中。

参考: Big C++ 中文版

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++-内存管理(整理笔记)

  C++内存管理(整理笔记)C++内存管理详解l          内存分配方式在C++中,内存分成5个区,分别是堆、栈、自由存储区、全局/静态区和常量存储区. 栈:存放函数参数以及局部变量,在出作...
  • MasterFT
  • MasterFT
  • 2007年07月27日 16:24
  • 11497

一个C++的内存池和内存管理的实现(一)

用C++编写高效稳定的软件,有效的内存管理通常是绕不开的一个题目,尤其是对于复杂庞大的商业软件。...
  • qiyao_2000
  • qiyao_2000
  • 2015年04月17日 18:11
  • 1055

C++11读书笔记—7(内存管理)

当你羡慕Java垃圾回收时,你想没想过java的垃圾回收机制靠C++实现的,而其实早先C++版本的实现。 其实C++的内存分配的难点不是把不该回收的回收了。而是有些不像指针的指针很容易识别不了。 一....
  • dajiabudongdao
  • dajiabudongdao
  • 2016年08月04日 15:39
  • 562

C++多线程内存管理

  原文:http://yachang.wang.blog.163.com/blog/static/35551220200762753057335/  假设有一个进程,创建了两个线程A、B,线程A在堆...
  • memory01
  • memory01
  • 2011年05月16日 17:00
  • 5887

C++内存管理学习笔记(5)

/****************************************************************/ /*            学习是合作和分享式的! /* ...
  • wdzxl198
  • wdzxl198
  • 2013年06月17日 14:31
  • 7536

C/C++动态内存创建与内存管理

1 内存空间逻辑组织A 静态数据区:内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整...
  • freshui
  • freshui
  • 2007年07月19日 13:39
  • 3192

C/C++内存管理与Java内存的各种分配

最近在看一些面试题,于是就查找了java与C/C++在内存上的差异 Java的内存管理实质上就是JVM的内存管理   JVM的内存分为两部分:stack和heap   Stack...
  • Losteng
  • Losteng
  • 2016年03月10日 23:03
  • 1233

C++程序设计内存管理器(内存池)

一、New/malloc内存分配很慢 C语言中的标准库函数malloc、free、calloc和realloc,以及C++中的new、new[]、delete和delete[] 操作符,是这两种语...
  • Robin__Chou
  • Robin__Chou
  • 2016年03月26日 20:45
  • 2144

【Linux】Linux内存介绍以及C与C++内存管理

讲解linux中内存分布,swap和内存相关内容。c与c++的内存管理进行介绍。Java在需要对象的时候直接new一个出来就好了,使用完之后一般不需要考虑内存释放的问题,GC会负责垃圾回收的善后工作,...
  • s120922718
  • s120922718
  • 2013年06月06日 09:45
  • 2666

C\C++和Java 的区别(特别是在内存分配方面)

前言:今天当被问到有关C与Java之间在内存管理方面的不同是什么时,瞬间 T_T__,所以特意集众人之解,存入自己的学习笔记中,加以学习和巩固。 ---------------------------...
  • u012209626
  • u012209626
  • 2015年07月20日 22:22
  • 2324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++内存管理——C++内存分类
举报原因:
原因补充:

(最多只允许输入30个字)