C++程序的存储区域划分

先进先出(First In,Last Out)
在这里插入图片描述

队列

先进先出(First In,First Out)
在这里插入图片描述


每行代码在内存单元中的地址位置

在这里插入图片描述
在这里插入图片描述
还有一块常量区,在HEAP和常量区之间

堆heap

动态分配资源

  1. 从现代的编程语言角度来看,使用堆,或者说使用动态内存分配,是一件很自然不过的事情。
  2. 动态内存带来了不确定性:内存分配耗时需要多久?失败了怎么办?在实时性要求比较高的场合,如一些嵌入式控制器和电信设备。
  3. 一般而言,当我们在堆上分配内存时,很多语言会使用new这样的关键字,有些语言则是隐式分配。在C++中new的对应词是delete,是因为C++是可以让程序员完全接管内存的分配释放的。

分配和回收动态内存的原则

程序通常需要牵涉到三个内存管理器的操作:

  1. 分配一个某个大小的内存块
  2. 释放一个之前分配的内存块
  3. 垃圾收拾操作,寻找不再使用的内存块并予以释放。这个回收策略需要实现性能,实时性,额外开销等各方面的平衡有统一和高效的做法。
    C++做了1,2两件事;而Java做了1,3两件事。

资源管理方案-RAII

RAII:Resource Acquistion Is Initialization

  • 依托栈和析构函数,来对所有的资源-包括堆内存在内进行管理。对RAII的使用,使得C++不需要类似于Java那样的垃圾收集方法,也能有效地对内存进行管理。RAII的存在,也是垃圾收集虽然理论上可以在C++使用,但从来 没有真正流行过的主要原因。
  • -RAII有些比较成熟的智能指针代表:如std::auto_ptr和boost:shared_ptr

几种变量的对比

栈和堆中的变量的对比

栈(stack)区堆(heap)区
作用域函数体内,语句块{}作用域整个程序范围内,由new,malloc开始,delete,free结束
编译期间大小确定变量大小范围变量大小范围不确定,需要运行期确定
大小范围Windows系统默认栈大小是1M,Linux常见默认的栈大小是8M或10M(通过ulimit -s查看;不同linux发行版的命令不保证相同)所有系统的堆空间上限是接近内存(虚拟内存)的总大小的(一 部分被OS占用)
内存分配方式地址由高到低减少地址由低到高增加
内容是否可变可变可变

全局静态存储区和常量存储区的变量对比

全局静态存储区常量存储区
存储内容全局变量,静态变量常量
编译期间大小是否确定确定确定
内容是否可变可变不可变

内存释放
在这里插入图片描述

内存泄漏

指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏发生原因

  1. 内存泄漏主要发生在堆内存分配方式中,即“配置了内存后,所有指向该内存的指针都遗失了”。若缺乏语言这样的垃圾回收机制,这样的内存就无法归还系统。
  2. 因为内存泄漏属于程序运行中的问题,无法通过编译识别,所以只能在程序运行过程中来判别和诊断。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++程序的内存区域划分主要包括栈区、堆区、全局/静态存储区和常量存储区。 1. 栈区(Stack): - 栈区用于存储局部变量和函数调用时的参数。 - 栈区的内存分配和释放是由系统自动完成的,速度较快。 - 栈区的大小是有限的,一般较小,通常在几MB到几十MB之间。 - 栈区的内存分配是按照“先进后出”的原则进行的,即后进入的变量先释放。 2. 堆区(Heap): - 堆区用于存储动态分配的内存,例如使用new或malloc函数分配的内存。 - 堆区的内存分配和释放需要程序员手动控制。 - 堆区的内存分配速度相对较慢,而且容易产生内存碎片。 - 堆区的大小一般比栈区大得多,可以达到几GB甚至更大。 3. 全局/静态存储区: - 全局/静态存储区用于存储全局变量和静态变量。 - 全局变量在程序的整个生命周期内都存在,静态变量在定义时分配内存,直到程序结束才释放。 - 全局/静态存储区的内存分配和释放由系统自动完成。 4. 常量存储区: - 常量存储区用于存储常量数据,例如字符串常量。 - 常量存储区的内存分配和释放由系统自动完成。 下面是一个C++程序内存区域划分的示例: ```cpp #include <iostream> int globalVariable; // 全局变量 int main() { int localVariable; // 局部变量 int* dynamicVariable = new int; // 动态分配的变量 std::cout << "地址:全局变量 - " << &globalVariable << std::endl; std::cout << "地址:局部变量 - " << &localVariable << std::endl; std::cout << "地址:动态变量 - " << dynamicVariable << std::endl; delete dynamicVariable; // 释放动态分配的内存 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值