当前位置: 首页 > news >正文

【C语言】常见的动态内存管理错误

前言

上一篇介绍了C语言中 动态内存管理函数,本片讲解的是 在我们使用动态内存管理时 常见的错误,一起来看看吧~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~


目录

1.对NULL指针的解引⽤操作

错误代码展示

修改

2.对动态开辟空间的越界访问

错误代码展示

修改

3 .对⾮动态开辟内存使⽤free释放

错误代码展示

4 .使⽤free释放⼀块动态开辟内存的⼀部分

错误代码展示

5. 对同⼀块动态内存多次释放

错误代码展示

修改

6.动态开辟内存忘记释放(内存泄漏)

错误代码展示

修改​编辑


1.对NULL指针的解引⽤操作

错误代码展示

int main()
{int* p = (int*)malloc(100);*p = 20;//p有可能是NULL指针	//释放free(p);p = NULL;return 0;
}

修改

2.对动态开辟空间的越界访问

错误代码展示

int main()
{int *p=(int*)malloc(40);if (p == NULL){return 1;}//使用for (int i = 0; i <= 10; i++){*(p + i) = i;//当访问第11个元素时,就越界访问了}free(p);p = NULL;return 0;
}

修改

3 .对⾮动态开辟内存使⽤free释放

错误代码展示

int main()
{int a = 10;//⾮动态开辟内存int* p = (int*)malloc(40);if (p == NULL){return 1;}//使用//……p = &a;//p指向的空间不再是堆区上空间了free(p);p = NULL;return 0;
}

4 .使⽤free释放⼀块动态开辟内存的⼀部分

错误代码展示

void test()
{int *p = (int *)malloc(100);if (p == NULL)return 1;//使用p++;//释放free(p);//p不再指向动态内存的起始位置 
}

5. 对同⼀块动态内存多次释放

错误代码展示


void test()
{int* p = (int*)malloc(100);if (p == NULL){return 1;}free(p);free(p);//重复释放 
}

修改

6.动态开辟内存忘记释放(内存泄漏)

malloc、calloc、realloc申请的空间如果不主动释放,出了作用域不会销毁
释放的方式

  1. free主动释放
  2. 直到程序结束,由操作系统回收

malloc函数出了test函数申请的空间不会销毁,造成内存泄漏

错误代码展示


void test()
{int* p = (int*)malloc(100);if (NULL != p){*p = 20;}
}int main()
{test();while (1);
}

修改

相关文章:

  • AI Agent
  • 【Web】get请求和post请求的区别
  • fork创建子进程及僵尸进程的产生及规避
  • 百度交出2023年业绩答卷:全力提速AI布局,注入业绩增长新动能
  • React withRouter的使用及源码实现
  • AVL 树
  • Rocketmq java hello world 入门案例
  • LaMa Image Inpainting 图像修复 Onnx Demo
  • 贪心算法(算法竞赛、蓝桥杯)--修理牛棚
  • jmeter接口测试
  • Docker 第十九章 : 阿里云个人镜像仓使用
  • FPGA之带有进位逻辑的加法运算
  • docker单机启动mysql、redis容器命令
  • 2023中国PostgreSQL数据库生态大会:洞察前沿趋势,探索无限可能(附核心PPT资料下载)
  • 【SpringBoot3】统一参数校验
  • CEF与代理
  • CSS实用技巧
  • Java 多线程编程之:notify 和 wait 用法
  • nodejs实现webservice问题总结
  • vue总结
  • Web标准制定过程
  • 好的网址,关于.net 4.0 ,vs 2010
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 码农张的Bug人生 - 见面之礼
  • 你真的知道 == 和 equals 的区别吗?
  • 如何利用MongoDB打造TOP榜小程序
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 用jquery写贪吃蛇
  • PostgreSQL之连接数修改
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​MySQL主从复制一致性检测
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Lua:Lua调用C++生成的DLL库
  • (1)(1.13) SiK无线电高级配置(五)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (7)STL算法之交换赋值
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)计算机毕业设计大学生兼职系统
  • (一)插入排序
  • (转)3D模板阴影原理
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • /proc/stat文件详解(翻译)
  • @staticmethod和@classmethod的作用与区别
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [ACTF2020 新生赛]Include
  • [BZOJ 3282] Tree 【LCT】
  • [C/C++] -- 二叉树
  • [CF226E]Noble Knight's Path
  • [Django 0-1] Core.Email 模块
  • [GN] Vue3.2 快速上手 ---- 核心语法2
  • [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历
  • [LeetCode]-225. 用队列实现栈-232. 用栈实现队列
  • [LeetCode]284. Peeking Iterator(C++,类,暴力)