前言:最近正在学习有关static的知识,发觉对C++的内存分区不是很了解,上网查了很多资料,遂将这几天的学习笔记进行了简单整理,发表在这里

• 栈区(stack):主要用来存放函数的参数以及局部变量。栈区由系统进行内存管理,在函数完成执行时,系统会自行释放栈区的内存,而不需要用户参与管理。整个程序的栈区的大小可以在编译器中由用户自行设定,默认的栈区大小为3M


• 堆区(heap):由用户手动申请,手动释放。如果用户忘记对其所申请的内存资源进行释放,该内存资源可能会在程序结束时由操作系统(OS)进行释放(也可能不会)

[注意]:

1.C++系统内存分区中的堆和数据结构中的堆是不同的,但C++内存分区中的堆对系统资源的分配方式和数据结构中的链表却十分相似

2.在C中用户通常用malloc进行内存的申请,用free进行内存的释放;而在C++中用户通常用new进行内存的申请,用delete进行内存的释放(C++同样支持malloc/free方式)。

3.通常认为C++中有两个动态内存区域。通过new/delete方式进行内存资源的分配和释放的称为自由存储区(free store),而通过malloc/free方式进行内存资源的分配和释放的称为堆区(heap)。但本质上来说很多编译器中的new操作符是通过malloc进行内存申请的,因此可以将堆区理解为自由存储区的一个具体实现,虽然二者不完全相同,但很多时候可以混为一谈。 (如果想细究堆区和自由存储区的不同,可以参考这个博客:http://www.cnblogs.com/QG-whz/p/5060894.html)

4.new与malloc的几点不同:

  • malloc是C语言中的函数,而new是C++中的操作符

  • malloc申请之后返回的类型是void*,而new返回的指针则是带有特定数据类型的

  • malloc只负责内存的分配而不会调用类的构造函数,而new不仅会分配内存,而且会自动调用类的构造函数


• 静态区(全局区)(static):用来存放程序的全局变量和静态变量。在C语言中,初始化的全局变量和静态变量放在一块内存区域中,而未初始化的全局变量和静态变量放在与之相邻的另一块内存区域中。而在C++中则没有在静态区中将初始化的和未初始化的变量进行分开存储,因为C++会对未初始化的全局变量和静态变量进行默认初始化(一般默认初始化为0)。该区域存储的数据会在程序结束后由系统来释放。

 [注意]:

全局变量和静态全局变量在C++中的存储方式是一样的,但不同的是全局变量在整个源代码中都是可以使用的,而静态全局变量只能在当前文件中使用。比如一个程序有3个文件a.cpp、b.cpp和c.cpp,如果在文件a.cpp中定义了一个全局变量x,那么该变量x在文件a.cpp、b.cpp和c.cpp中都可以使用;但如果在文件a.cpp中定义了一个静态全局变量y,那么该变量y只能在文件a.cpp中使用文件b.cpp和文件c.cpp都不可以使用该静态全局变量y


 • 常量存储区:用来存储程序中的常量,比如const常量,字符串常量等都存储在这个区域。该区域存储的数据会在程序结束后由系统来释放

[注意]:

1.在程序运行期间,该区域中存储的常量是全局可见的。

2.当我们定义char *ptr="Tomwenxing"时,字符串“Tomwenixng”就存储在这个区域


• 代码区:存放程序体的二进制代码。比如我们在程序中自定义的函数,其函数体就是以二进制代码的形式存储在这个区域的


• 实例:

 #include<iostream>
#include<cstring>
using namespace std;
int value1=; //全局变量:存储在静态区(全局区)
const int value2=; //const常量:存储在常量区
static int value3=; //static变量:存储在静态区 (全局区)

//函数func:存储在代码区
void func(int a){ //a为函数参数:存储在栈区
int temp=; //局部变量:存储在栈区
static int temp2; //静态变量(默认初始化为0):存储在静态区(全局区)
cout<<"This is func"<<endl; // "This is func"是字面值常量:存储在常量区
} //函数main:存储在代码区
int main(){
int value4=; //局部变量;存储在栈区
char *ptr1=NULL; //局部变量:存储在栈区
static int value5=; //静态变量:存储在静态区(全局区)
char *ptr2="Tomwenxing"; //ptr2为局部变量:存储在栈区; "Tomwenxing"为字面值常量:存储在常量区
ptr1=(char*)malloc(sizeof(char)*); // malloc动态开辟的空间:存储在堆区
strcpy(ptr1,"Hello"); //"Hello"是字面值常量:存储在常量区
free(ptr1);
int *ptr3=new int; //ptr3为局部变量:存储在栈区;new动态开辟的空间:存储在堆区(自由存储区)
delete ptr3;
return ;
}

C++:内存分区的更多相关文章

  1. C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏

    导读 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内存分区,分别为: 1. 五大内存分区:堆.栈.全局/静态存储区.自由存储区和常量存储区. 2. 五大内存分区:堆 ...

  2. c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区

    一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变 ...

  3. [内存管理]linux内存管理 之 内存节点和内存分区

    Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...

  4. JVM的内存分区

    JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1.       JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Sw ...

  5. jvm性能优化及内存分区

     jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...

  6. C/C++内存分区

    C/C++编译的程序占用的内存分区 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若 ...

  7. C++ 构造函数_内存分区_对象初始化

    内存分区 栈区:int  x = 0:int  *p = NULL; 定义一个变量,定义一个指针时,会在栈区进行分配内存.分配的内存系统分配收回的,我们不用管. 堆区:int  *p = new  i ...

  8. C/C++的四大内存分区和常量的存储位置

    原文:https://blog.csdn.net/k346k346/article/details/45592329 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内 ...

  9. Linux C/C++基础——内存分区

    1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...

随机推荐

  1. 【面向对象】用大白话扯扯那"神奇"的面向对象编程思维(二)

    前言: 上一章我们用大白话讲解了一下面向对象的编程思维,那么这一张我们来讲讲如何用面向对象来书写代码.终于到了激动人心的时刻了..... 传送门:https://www.cnblogs.com/sy1 ...

  2. Tarjan算法初探 (1):Tarjan如何求有向图的强连通分量

    在此大概讲一下初学Tarjan算法的领悟( QwQ) Tarjan算法 是图论的非常经典的算法 可以用来寻找有向图中的强连通分量 与此同时也可以通过寻找图中的强连通分量来进行缩点 首先给出强连通分量的 ...

  3. day 94 Django学习之django自带的contentType表

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

  4. Get與Post的區別--總結隨筆

    關於Get與Post的區別的文章,在網上太多了:有優點有缺點,今天我給各位大哥做一個總結性的隨筆,還請多多包涵~ 首先是W3School上的答案,請查收: GET在浏览器回退时是无害的,而POST会再 ...

  5. 20155339 第七周加分项目 mybash的实现

    mybash的实现 要求 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 学习相关知识 fork函数 查看 ...

  6. 洛谷 P2563 [AHOI2001]质数和分解

    洛谷  P2563 [AHOI2001]质数和分解 题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能 ...

  7. 3992: [SDOI2015]序列统计

    3992: [SDOI2015]序列统计 链接 分析: 给定一个集和s,求多少个长度为n的序列,满足序列中每个数都属于s,并且所有数的乘积模m等于x. 设$f=\sum\limits_{i=0}^{n ...

  8. GNS3 jungle newsfeed 隐藏

    windows 7 windows 8.1 1.开始---运行 输入(没有引号):“%appdata%” 2.修改---GNS3/gns3_gui.ini 的两行参数 "default_lo ...

  9. Apache和Nginx比较

    Apache和Nginx对比 功能对比 Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP.Perl.Python等,同时还支持正向 ...

  10. 第一个Django demo

    平台:Pycharm Django 使用 Pycharm 进行开发,需要提前在 Pycharm 中(File > Settings > Project: Python > Proje ...