IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 动态内存 -> 正文阅读

[C++知识库]动态内存

以下情况需要用到动态内存:

  1. 需要通过变量定义数组长度
  2. 需要定义大容量的数组

说明:

数组局部变量栈在windows中的默认大小为1M,Linux中默认大小为10M,因此在堆heap中进行内存申请——动态内存的开辟。

三种方式:

malloc

realloc

calloc

malloc:

头文件:#include<stdlib.h>

使用:

????????引入头文件->函数内进行开辟内存->判断是否开辟成功->使用完之后释放内存->p=NULL(防止野指针出现)

????????eg: 动态开辟10个(键盘获取)int 类型的一维数组

????????int num=10;

????????int *p =(int*)malloc(sizeof(int)*num);//开辟了40个字节大小,再强转成int*

????????if?(p != NULL)

????????????????printf("开辟成功"); //申请成功返回的是成功后的内存地址

????????else

????????????????printf("开辟失败");

申请内存空间的上限:Windows:32位x86 1.7G~1.9G。linux:32位操作系统,3G

内存回收:

????????需要通过程序员进行内存释放——free(P);

? ? ? ? 需要一一对应(1个malloc对应1个free),否则会有内存泄漏

memset:

????????用于初始化内存的函数,于malloc搭配使用。

用法:memset(p,0,n)//将p数组的n个格子个数,初始化为0

calloc:

=malloc+for /malloc+memset

函数原型:

????????void *calloc(size_t?num,size_t?size);//size_t=unsigned int

????????num:申请单元个数;size:每个单元占用的字节数。

头文件:#include<stdlib.h>

使用:

????????引入头文件->malloc函数进行开辟内存->判断是否开辟成功->使用完之后free释放内存

eg:int *p=(int*)calloc(10,sizeof(int));

realloc:

原来内存不足进行扩容、缩容。

三种内容大小的扩充方式:

????????1.后面的区域比较充裕,直接在原内存后面续上,如图所示。

? ? ? ?

2.前面有空余:将内存中的内容赋值到前面,后面空闲出来的内存相当于对其扩充内存,如图所示。

? ? ??

3.堆内存不足,扩展空间失败,realloc函数返回NULL。

头文件:#include<stdlib.h>

使用:

????????引入头文件->malloc函数进行开辟内存->判断是否开辟成功->for将原来内容拷贝到新内存中->使用完之后free释放内存

????????eg:

????????#include<stdio.h>

????????#include?<string.h>

????????#include<stdlib.h>

????????#include<assert.h>

????????int?main()

????????{

????????int?n = 1;

????????int* p = (int*)malloc(sizeof(int) * n);

????????if?(p == NULL)

????????{

????????????????printf("内存申请失败");

????????????????exit(-1);//0是正常退出,-或+异常退出。

????????}

????????memset(p, 0, n);

//假设一番操作后发现内存不足,要进行2倍扩容

????????p = (int*)realloc(p, sizeof(int) * n * 2);

????????assert(p != NULL);

????????return?0;

}

释放动态内存存在的问题:

  1. 动态申请的内存首地址发生改变。如p++,而free(p)是释放p当前指向的地址,p当前指向的是无效内存,相当于野指针,free(p)系统会崩溃。
  2. 如果只定义了一次就不能多次释放一块内存空间,第二次释放就相当于free(NULL),没意义
  3. malloc申请内存,申请失败,在使用中数组下标会越界,此刻无法释放内存。

什么时候会释放内存:

  1. 关机了之后
  2. 进程终止(可简单理解为正在进行的程序)
  3. 服务器发生内存泄露(可用vld进行内存泄漏测试)
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:12:28  更:2022-02-26 11:15:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:21:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码