| |
|
开发:
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++知识库]动态内存 |
以下情况需要用到动态内存:
说明: 数组局部变量栈在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; } 释放动态内存存在的问题:
什么时候会释放内存:
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |