C++程序的内存分区,为什么要使用动态内存,动态内存的分配使用释放

Posted Respect@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++程序的内存分区,为什么要使用动态内存,动态内存的分配使用释放相关的知识,希望对你有一定的参考价值。

C++程序的内存分区

在这里插入图片描述

为什么要使用动态内存

1.按需分配,根据需要分配内存,不浪费

new 分配内存布局图
在这里插入图片描述
2. 被调用函数之外需要使用被调用函数内部的指针对有应的地址空间

C 内存分配:
void *malloc(size_t size);
void free(void *);
malloc 在内存的动态存储区中分配一块长度为 size 字节的连续区域返回该区域 的首地址.

3.突破栈区的限制,可以给程序分配更多的内存

动态内存的分配、使用、释放

new 和 delete 基本语法
1)在软件项目开发过程中,我们经常需要动态地分配和撤销内存空间,特 别是数据结构中结点的插入与删除。在 C 语言中是利用库函数 malloc 和 free 来 分配和撤销内存空间的。C++提供了较简便而功能较强的运算符 new 和 delete 来 取代 malloc 和 free 函数。 (注意: new 和 delete 是运算符,不是函数,因此执行效率高。)

2)虽然为了与 C 语言兼容,C++仍保留 malloc 和 free 函数,但建议用户不 用 malloc 和 free 函数,而用 new 和 delete 运算符。

new 运算符的例子:
new int; //开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(10); //开辟一个存放整数的空间,并指定该整数的初值为 10,返回一个指向该存 储空间的地址
new char[100]; //开辟一个存放字符数组(包括 100 个元素)的空间,返回首元素的地址 new int[5][4]; //开辟一个存放二维整型数组(大小为 5*4)的空间,返回首元素的地址
float *p=new float (3.14159); //开辟一个存放单精度数的空间,并指定该实数的 初值为//3.14159,将返回的该空间的地址赋给指针变量 p

3)new 和 delete 运算符使用的一般格式为:
在这里插入图片描述

C++程序员的噩梦-内存泄漏

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

变量的 4 种存储类型
所有的数据都有两种类型 数据类型: 如 int,float 等

存储类型: 总共有四种存储类型的变量,分别为自动变量(auto)、静态变量 (static)、外部变量(extern)以及寄存器变量(register)。

auto - 函数中所有的非静态局部变量。

register - 一般经常被使用的的变量(如某一变量需要计算几千次)可以设 置成寄存器变量,register 变量会被存储在寄存器中,计算速度远快于存在内存 中的非 register 变量。

static - 在变量前加上 static 关键字的变量。

extern - 把全局变量在其他源文件中声明成 extern 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。

变量的作用域和生存周期

在这里插入图片描述
函数返回值使用指针
可以返回函数内部:动态分配内存地址 局部静态变量地址 以及全局静态变量和外部变量 地址

常见错误总结

  1. 申请的内存多次释放
  2. 内存泄漏
  3. 释放的内存不是申请时的地址
  4. 释放空指针
  5. 释放一个内存块,但继续引用其中的内容
  6. 越界访问

在这里插入图片描述

一年入门,三年入行,五年入道,七年入定,十年入化
在这里插入图片描述

以上是关于C++程序的内存分区,为什么要使用动态内存,动态内存的分配使用释放的主要内容,如果未能解决你的问题,请参考以下文章

C++动态内存管理

C++动态内存管理

C++动态内存管理

C零基础视频-45-内存的分区:全局区栈区堆

深入详解C/C++动态内存管理

:内存管理 -- 内存空间的扩充(覆盖技术交换技术)连续分配管理方式(单一连续分配(系统区/用户区)固定分区分配动态分区分配)动态分区分配算法