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 变量,可以扩展该全局变 量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
变量的作用域和生存周期
函数返回值使用指针
可以返回函数内部:动态分配内存地址 局部静态变量地址 以及全局静态变量和外部变量 地址
常见错误总结
- 申请的内存多次释放
- 内存泄漏
- 释放的内存不是申请时的地址
- 释放空指针
- 释放一个内存块,但继续引用其中的内容
- 越界访问
一年入门,三年入行,五年入道,七年入定,十年入化
以上是关于C++程序的内存分区,为什么要使用动态内存,动态内存的分配使用释放的主要内容,如果未能解决你的问题,请参考以下文章
:内存管理 -- 内存空间的扩充(覆盖技术交换技术)连续分配管理方式(单一连续分配(系统区/用户区)固定分区分配动态分区分配)动态分区分配算法