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相关推荐

  1. 鸿蒙内核之内存调测:动态内存池信息统计

    摘要:内存调测方法旨在辅助定位动态内存相关问题,提供了基础的动态内存池信息统计手段,向用户呈现内存池水线.碎片率等信息. 本文分享自华为云社区<鸿蒙轻内核-内存调测-内存信息统计>,作者: ...

  2. 内存分配函数(动态内存分配)详解

    目录

  3. 【C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  5. 从结构体、内存池初始化到申请释放,详细解读鸿蒙轻内核的动态内存管理

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  6. 6000字总结动态内存管理

    目录 一.内存划分 二.四大函数 ①malloc ②free ③calloc ④realloc 三.易错分析 问题一: 问题二: 问题三: 问题四: 问题五: 问题六: 四.经典面试题 面试题一: 面 ...

  7. C语言提高篇之——动态内存管理

    目录 1. 动态内存分配存在的意义 2.动态内存函数介绍 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.常见的动态内存错误 3.1 对空指针解引用 3.2 ...

  8. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  9. 【C进阶】动态内存管理

    ⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言进阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...

最新文章

  1. Serverless应用场景
  2. 数据库被挂马的ASP处理方法
  3. Mysql多表查询(案例2)
  4. 计算机的组成和Linux的发行版本介绍
  5. 写给自己,2020的年终总结
  6. jpa 返回数据转换_如何使用JPA类型转换器加密数据
  7. Supervisord进程管家
  8. javaScript几种设计模式之一——单体模式
  9. CCF201709-3 JSON查询(100分)【文本处理】
  10. 【LOJ 10064】黑暗城堡
  11. ios13测试版怎么卸载软件,苹果iOS13怎么卸载软件 iOS13删除软件教程
  12. Android的LogCat的使用
  13. 2021抖音数据报告
  14. 支持win7的无损分区大小调整软件
  15. 漂亮的表格样式(使用CSS样式表控制表格样式)
  16. Attention 与Hierarchical Attention Networks 原理
  17. Android所有View通用下拉刷新上拉加载控件
  18. docker安装nexus私服
  19. python 申请内存_python内存分配
  20. java图片拷贝_java图片拷贝

热门文章

  1. 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot
  2. mysql 内连接条件_Mysql内连接有OR条件?
  3. Android TextView setGravity不起作用
  4. mysql怎么生成可执行文件_查询mysql数据库的java程序在myeclipse上运行正常,但生成可执行文件后查询不出结果。问题出在哪儿呢?...
  5. ubuntu更改mysql编码格式_Ubuntu修改mysql编码格式
  6. 华为修改优先级命令_(完整版)华为设备基本配置命令
  7. C++ STL容器vector篇(五) vector容器常用初始化操作总结(一维/二维)
  8. python requests返回值为200 但是text无内容_接口测试入门神器 - Requests
  9. Mobaxterm中使用git log报错/bin/busybox.exe less -R no such file or directory
  10. mongodb更新操作符$inc,$mul