C++中的内存分区介绍_C 语言

C++的内存划分为栈区、堆区、全局区/静态区、字符串常量和代码区。

这里去掉自由存储区,增加了代码区,理由会在下面讲到。

栈区:由系统进行内存的管理。

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

全局/静态区:全局、静态数据存放在一起的,初始化的全局变量和静态变量是在一起的。未初始化的全局变量和静态变量是在相邻的空间中。

说明:全局变量和静态全局变量的存储方式是一致的,但是其区别在于,全局变量在整个源代码中都可以使用,而静态全局变量只能在当前文件中有效。比如我们的一个程序有5个文件,那么某个文件中申请了静态全局变量,这个静态全局变量只能在当前文件中使用,其他四个文件均不可以使用。而某个文件中申请了全局变量,那么其他四个文件中都可以使用该全局变量(只需要通过关键字extern申明一下就可以使用了)。事实上static改变了变量的作用范围。

字符串常量区:存放字符串常量,程序结束后,由系统进行释放。比如我们定义char * p = “Hello World”; 这里的“Hello World”就是在字符串常量中,最终系统会自动释放。

代码区:存放程序体的二进制代码。比如我们写的函数,都是在代码区的。

堆区:由用户手动申请,手动释放。在C中使用malloc,在C++中使用new(当然C++中也可以使用malloc)。

说明:new操作符本质上还是使用了malloc进行内存的申请,因此我将自由存储区和堆区都说成堆区,不过两者还是有很大的差别。

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

2)malloc申请之后返回的类型是VOID*,而new返回的指针带有类型。

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

时间: 2024-12-23 02:01:58

C++中的内存分区介绍_C 语言的相关文章

通过一个小例子来简单理解C语言中的内存空间管理_C 语言

对于一个C语言程序而言,内存空间主要由五个部分组成代码段(.text).数据段(.data).BSS段(.bss),堆和栈组成,其中代码段,数据段和BSS段是编译的时候由编译器分配的,而堆和 栈是程序运行的时候由系统分配的.布局如下 在上图中,由编译器分配的地址空间都是在连接的时候分配的,而运行时分配的空间是在程序运行时由系统分配的 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化

C++开发:为什么多线程读写shared_ptr要加锁的详细介绍_C 语言

我在<Linux 多线程服务端编程:使用 muduo C++ 网络库>第 1.9 节"再论 shared_ptr 的线程安全"中写道: (shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化.根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程

详解C语言中的内存四区模型及结构体对内存的使用_C 语言

内存四区 1.代码区代码区code,程序被操作系统加载到内存的时候,所有的可执行代码都加载到代码区,也叫代码段,这块内存是不可以在运行期间修改的.2.静态区所有的全局变量以及程序中的静态变量都存储到静态区.3.栈区栈stack是一种先进后出的内存结构,所有的自动变量,函数的形参都是由编译器自动放出栈中,当一个自动变量超出其作用域时,自动从栈中弹出.对于自动变量,什么时候入栈,什么时候出栈,是不需要程序控制的,由C语言编译器.实现栈不会很大,一般都是以K为单位的. 当栈空间以满,但还往栈内存压变量

operator new在C++中的各种写法总结_C 语言

乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次.这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要的,是否能写一个自定义的分配器,某种高级内存管理表或一个特定的垃圾回收机制. 这篇文章并不是一个综合的手册,而是一个C++中各种内存分配方法的概述.它面向已经很熟悉C++语言的读者. 原生operator new 我们先从原生operator new开始.考虑如下代码,它用来分配5个int型的空间并

win32下进程间通信(共享内存)实例分析_C 语言

一.概述 很多情况下在Windows程序中,各个进程之间往往需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换. 进程间通讯(即:同机通讯)和数据交换有多种方式:消息.共享内存.匿名(命名)管道.邮槽.Windows套接字等多种技术."共享内存"(shared memory)可以定义为对一个以上的进程是可见的内存或存在于多个进程的虚拟地址空间.例如:如果两个进程使用相同的DLL,只把DLL的代码

C/C++产生随机数函数简单介绍_C 语言

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了.)  我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数

浅谈C/C++ 语言中的表达式求值_C 语言

经常可以在一些讨论组里看到下面的提问:"谁知道下面C语句给n赋什么值?" m = 1; n = m+++m++; 最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5: a = 4; cout << a++ << a; C++ 不是规定 << 操作左结合吗?是C++ 书上写错了,还是这个系统的实现有问题? 注:运行a = 4; cout << a++ << a; 如在Visua

C++内存查找实例_C 语言

本文实例讲述了C++内存查找的方法,分享给大家供大家参考.具体如下: windows程序设计中的内存查找功能,主程序代码如下: 复制代码 代码如下: // MemRepair.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>    BOOL FindFirst(DWORD dwValue);  BOOL FindNext(DWORD dwValue);  HANDLE g_hProce

C语言获取消耗内存的方法_C 语言

本文实例讲述了C语言获取消耗内存的方法.分享给大家供大家参考.具体实现方法如下: /* * 消耗内存 */ #include <stdio.h> #include <stdlib.h> main() { int MB=0; while(malloc(1<<20)) ++MB; printf("Alloced %d MB total\n",MB); } 希望本文所述对大家的C语言程序设计有所帮助. 以上是小编为您精心准备的的内容,在的博客.问答.公众号