C++:内存分区
前言:最近正在学习有关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++:内存分区的更多相关文章
- C/C++的四大内存分区 分类: C/C++ 2015-05-09 01:36 163人阅读 评论(0) 收藏
导读 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内存分区,分别为: 1. 五大内存分区:堆.栈.全局/静态存储区.自由存储区和常量存储区. 2. 五大内存分区:堆 ...
- c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区
一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变 ...
- [内存管理]linux内存管理 之 内存节点和内存分区
Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...
- JVM的内存分区
JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况. 1. JVM的内存和系统内存的关系 下图是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Sw ...
- jvm性能优化及内存分区
jvm性能优化及内存分区 2012-09-17 15:51:37 分类: Java Some of the default values for Sun JVMs are listed below. ...
- C/C++内存分区
C/C++编译的程序占用的内存分区 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数名,局部变量的名等.其操作方式类似于数据结构中的栈. 2.堆区(heap)— 由程序员分配释放, 若 ...
- C++ 构造函数_内存分区_对象初始化
内存分区 栈区:int x = 0:int *p = NULL; 定义一个变量,定义一个指针时,会在栈区进行分配内存.分配的内存系统分配收回的,我们不用管. 堆区:int *p = new i ...
- C/C++的四大内存分区和常量的存储位置
原文:https://blog.csdn.net/k346k346/article/details/45592329 正确的理解C/C++程序的内存分区,是合格程序猿的基本要求. 网络上流形两大版本内 ...
- Linux C/C++基础——内存分区
1.内存分区 在生活中,为了提高办事效率,某个单位经常会分成N个部门,每个部门职责不同,同样,为了提高 效率,我们的内存也会被分成N个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...
随机推荐
- 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
第11章 GPIO输出—使用固件库点亮LED 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku. ...
- UNIX网络编程 卷2 源代码使用
1. 下载源码,W. Richard Stevens的主页:http://www.kohala.com/start/ wget http://www.kohala.com/start/unpv22e/ ...
- VRRP虚IP漂移
简介 VRRP 是 Virtual Router Redundancy Protocol 的简称,即 虚拟路由冗余协议 . 原文地址:https://linux-network-programming ...
- Linux学习笔记(第十章)
vim程序编辑器 vim特点: vim三种模式: 一般模式:打开文档就直接进入编辑模式 -可进行删除,复制等,无法直接编辑文档 编辑模式:按下[i,I,o,O,A,R,r]等字母才会进入编辑模式,按E ...
- Python的scrapy之爬取6毛小说网的圣墟
闲来无事想看个小说,打算下载到电脑上看,找了半天,没找到可以下载的网站,于是就想自己爬取一下小说内容并保存到本地 圣墟 第一章 沙漠中的彼岸花 - 辰东 - 6毛小说网 http://www.6ma ...
- 课下测试ch01修改补交
由于当时学习态度有问题,没有注意到第一次的课下测试,虽然在当周的总结中就进行补交,但是当时态度并没有很认真,可能没有引起老师的注意,现在重新修改,望老师谅解. (单选题 | 1 分) Amdahl定律 ...
- PostgreSQL的PITR中,对 unfilled wal log 如何处理为好
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 通过实验,可以发现,PostgreSQL中使 ...
- 联赛emacs配置
(custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you co ...
- Java的自动拆/装箱
作者:Alvin 关键字:语法糖 类 对象 参考 Java 中的语法糖 语法糖--这一篇全了解 浅谈 Integer 类 什么是Java中的自动拆装箱 深入剖析Java中的装箱和拆箱 前言 我们知道, ...
- 新建React Native项目步骤
根据官方环境 https://reactnative.cn/docs/getting-started/ 搭建好之后 1.新建项目 打开React Native 命令行工具,并输入 react-nati ...