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个区.这里我们将内存分为五个区.也有四区模型. 首先看一下一个二进制 ...
随机推荐
- (转)MySQL高可用方案MHA的部署和原理
背后深层次的逻辑: MHA Node则运行在每个mysql节点上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它自动将最新数据的slave提升为master,然 ...
- 郑重推荐开源CANopen协议栈CANFestival(LGPL许可)!!!!!!!!
郑重推荐开源CANopen协议栈CANFestival(LGPL许可)!!!!!!!!(这条文章已经被阅读了 次) 时间:2010/03/04 06:47am 来源:winshton [这个贴子最后由 ...
- asp.net core合并压缩资源文件(转载)
在asp.net core中使用BuildBundlerMinifier合并压缩资源文件 在asp.net mvc中可以使用Bundle来压缩合并css,js 不知道的见:http://www.cnb ...
- 笔记:long、longlong、int、float、NSString相互转换
NSString *"; // 1.字符串转int int intString = [string intValue]; // 2.int转字符串 NSString *stringInt = ...
- centos配置静态ip地址
1.输入以下命令: vim /etc/sysconfig/network-scripts/ifcfg-eth0 2.注释掉BOOTPROTO=dhcp 3.添加如下内容: ONBOOT=yes 表示开 ...
- pdf转中文txt
最近项目需要实现根据关键字搜索pdf内容,实现思路就是提取pdf文本,然后进行索引. 工具上选择: IText 4.16之后采用agpl License,不能用作商用,而且转换中文会有乱码问题, pd ...
- sqlplus 格式化一例
对字符型,用axx格式,对数字型,用9999 格式(999表示占用3列) SQL> col 'ts#' format 999SQL> col 'file#' format 999SQL&g ...
- 23-[模块]-logging
1.日志级别 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志 ...
- 3495: PA2010 Riddle
3495: PA2010 Riddle 链接 分析: 每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建.所以可以考虑2-sat. 但是如果在每个郡里两两连边,边数是n^2的. 考虑用前缀 ...
- rabbitmq的安装和使用
一.RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的.所有 ...