C ++ 内存 | C/C++的动态内存管理_1
C/C++的动态内存管理
1、
C语言中,我经常会用到动态内存管理的三个命令:
malloc
calloc
rolloc
free
(1)malloc
用来申请head内存空间的内存。
(2)calloc
malloc 和 calloc 之间,当 malloc 分配一些内存时,它不会初始化具有任何值的字节,因此如果你没有在分配的这些地址中填入任何值,通过 malloc ,你会有一些垃圾值,但如果你通过 calloc 分配内存,calloc 将所有字节位置设置为零值。所以,它也初始化了内存。
(3)realloc
void* realloc(void* Ptr, size_t sige)
第一个参数指向现有块的起始地址的指针,第二个参数是大小新区块。reallo 中可能存在几种情况,即新块的大小,我们想要的可能比前一个块的大小更大。在那种情况下,机器可以创建一个全新的块并复制先前的数据。如果连续或连续的内存已经可用对于现有块,也可以扩展现有块。
(4)free
释放head的动态内存,如果没有这个中命名,内存容易泄露。
2、
C++语言中,我们也经常会用到动态内存管理的两个命令:
new
delete
直接上码:
(malloc)
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)malloc(n*sizeof(int));for(int i=0; i<n; i++){A[i] = i + 1;}for(int i = 0; i<n; i++){printf("%d ", A[i]);}
}
运行结果:
(calloc)
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)calloc(n, sizeof(int));for(int i = 0; i<n; i++){printf("%d ", A[i]);}
}
运行结果:
注意:
calloc 在没有给数组赋值之前,它会初始化数组为0。
如果使用 malloc,内存分配一些垃圾值。
(free)
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)malloc(n*sizeof(int));for(int i=0; i<n; i++){A[i] = i + 1;}free(A);for(int i = 0; i<n; i++){printf("%d ", A[i]);}
}
运行结果:
注意:
可以看到我们已经释放 数组A 的内存成功。它的输出值是一些垃圾值。
但你可以看到 A[4] 是等于5,在某些机器上,这样的程序可能会导致我们的程序崩溃,我们应该始终确保使用已分配的内存,否则就像在黑暗中行走,我们不知道会发生什么。
(realloc)
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)malloc(n*sizeof(int));for(int i=0; i<n; i++){A[i] = i + 1;}int *B = (int*)realloc(A, 2*n*sizeof(int));printf("prev block address = %d , new address = %d\n",A,B);for(int i = 0; i<2*n; i++){printf("%d ", B[i]);}
}
运行结果:
注意:
这里输出 1 2 3 4 5 0 0 0 0 0 ,其余都是垃圾值,前五个数字是 数组A的,后面我们使用 realloc 扩展该指针的内存(2*n*sizeof(int)),增加了调用的内存。
如果减少内存呢?
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)malloc(n*sizeof(int));for(int i=0; i<n; i++){A[i] = i + 1;}int *B = (int*)realloc(A, (1/2)*sizeof(int));printf("prev block address = %d , new address = %d\n",A,B);for(int i = 0; i<2*n; i++){printf("%d ", B[i]);}
}
运行结果:
注意:
我这里出现这个错误,我使用的是C++,在C是可以运行的,而且编译器把5个值显示成2个值,其他值被释放了。
如果把内存大小设置为了0, int *B = (int*)realloc(A, 0); 那么A就会被释放了。这个语句就变成了free()。
如果把数组参数设置成Null?
#include<iostream>
using namespace std;int main()
{int n;cout << "Enter size of number:" << "\n";scanf("%d",&n);int *A = (int*)malloc(n*sizeof(int));for(int i=0; i<n; i++){A[i] = i + 1;}int *B = (int*)realloc(Null, n*sizeof(int));printf("prev block address = %d , new address = %d\n",A,B);for(int i = 0; i<2*n; i++){printf("%d ", B[i]);}
}
运行结果:
注意:
int *B = (int*)realloc(Null, n*sizeof(int));
把参数设置为Nul,这条语句相当于 malloc,申请一个新地址的内存。
对代码不满足,是任何真正有天才的程序员的根本特征。
C ++ 内存 | C/C++的动态内存管理_1相关推荐
- 鸿蒙内核之内存调测:动态内存池信息统计
摘要:内存调测方法旨在辅助定位动态内存相关问题,提供了基础的动态内存池信息统计手段,向用户呈现内存池水线.碎片率等信息. 本文分享自华为云社区<鸿蒙轻内核-内存调测-内存信息统计>,作者: ...
- 内存分配函数(动态内存分配)详解
目录
- 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言之动态内存管理与动态内存函数
文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...
- 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理
摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...
- 6000字总结动态内存管理
目录 一.内存划分 二.四大函数 ①malloc ②free ③calloc ④realloc 三.易错分析 问题一: 问题二: 问题三: 问题四: 问题五: 问题六: 四.经典面试题 面试题一: 面 ...
- C语言提高篇之——动态内存管理
目录 1. 动态内存分配存在的意义 2.动态内存函数介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.常见的动态内存错误 3.1 对空指针解引用 3.2 ...
- C语言 --- 动态内存管理(上)+优化版通讯录+笔试题
文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...
- 【C进阶】动态内存管理
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...
最新文章
- Serverless应用场景
- 数据库被挂马的ASP处理方法
- Mysql多表查询(案例2)
- 计算机的组成和Linux的发行版本介绍
- 写给自己,2020的年终总结
- jpa 返回数据转换_如何使用JPA类型转换器加密数据
- Supervisord进程管家
- javaScript几种设计模式之一——单体模式
- CCF201709-3 JSON查询(100分)【文本处理】
- 【LOJ 10064】黑暗城堡
- ios13测试版怎么卸载软件,苹果iOS13怎么卸载软件 iOS13删除软件教程
- Android的LogCat的使用
- 2021抖音数据报告
- 支持win7的无损分区大小调整软件
- 漂亮的表格样式(使用CSS样式表控制表格样式)
- Attention 与Hierarchical Attention Networks 原理
- Android所有View通用下拉刷新上拉加载控件
- docker安装nexus私服
- python 申请内存_python内存分配
- java图片拷贝_java图片拷贝
热门文章
- 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot
- mysql 内连接条件_Mysql内连接有OR条件?
- Android TextView setGravity不起作用
- mysql怎么生成可执行文件_查询mysql数据库的java程序在myeclipse上运行正常,但生成可执行文件后查询不出结果。问题出在哪儿呢?...
- ubuntu更改mysql编码格式_Ubuntu修改mysql编码格式
- 华为修改优先级命令_(完整版)华为设备基本配置命令
- C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
- python requests返回值为200 但是text无内容_接口测试入门神器 - Requests
- Mobaxterm中使用git log报错/bin/busybox.exe less -R no such file or directory
- mongodb更新操作符$inc,$mul