【C语言】段错误、内存溢出、内存泄漏(区别)、堆溢出、栈溢出

目录
  • 段错误
  • 内存溢出
  • 内存泄漏
  • 栈溢出
  • 堆溢出
  • 栈溢出和堆溢出区别

段错误

什么时候会发生段错误?

段错误通常发生在访问非法内存地址的时候,即使用了野指针(指向一个已删除的对象或者未申请访问受限内存区域的指针)或这试图修改字符串常量的内容。

内存溢出

内存溢出和内存泄漏的区别:https://v.douyin.com/MpQWyac/

  • 内存溢出指的是程序去申请内存时,没有足够的内存空间让他去使用,有的程序执行会直接就报out of memory超出内存的一个提示,这个和网盘空间不足是一个道理。
  • 内存泄漏它指的是程序去申请内存后,他没释放他已经申请的内存空间。比方说程序执行了一个死循环代码,每执行一次代码,它就会申请新的一个内存空间,程序又没法正常的退出循环,他就会不断地占用更多的内存空间。无论程序有多少内存,它迟早会被占光,所以说内存泄漏最终也会导致内存溢出

内存溢出指程序在申请内存时,没有足够的内存供申请者使用。内存溢出就是程序员要申请的内存空间超过了系统实际能够分配给你的空间,此时系统相当于没法满足程序员的需求,就会报内存溢出的错误。

内存溢出原因:

(1)内存中加载的数据量过于庞大,如一次性从数据库取出过多数据。

(2)集合类中有对对象的引用,使用后未清空,使得不能回收。

(3)代码中存在死循环或循环产生过多重复的对象实体。

(4)使用的第三方软件中的bug

(5)启动参数内存值设定的过小

内存泄漏

内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理意义上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

内存泄漏的分类:

(1)堆内存泄漏(heap leak):堆内存指的是程序在运行中根据通过malloc/new等从堆中分配的一块内存,使用完成后必须通过调用相对应的free/delete释放掉。如果程序设计的错误导致这部分内存没有被释放掉,那么此后这块内存将不会被使用,就会产生堆内存泄漏。

(2)系统资源泄漏(resource leak):主要指程序使用系统分配的资源比如bitmap、handle、socket等没有使用相应的函数释放掉,导致系统资源的浪费,严重时可导致系统性能降低,运行不稳定。

(3)没有将基类的析构函数定义为虚函数。当基类指针指向派生类的对象时,如果基类的析构函数不是虚函数,那么子类的析构函数将不会被调用,子类的资源没有被正确释放掉,因此造成内存泄漏。

如何判断内存泄漏?

内存泄漏通常是由于调用了malloc/new等申请内存的操作,但是缺少了对应的free/delete操作。为了判断内存泄漏,我们可以使用linux下的内存泄漏检查工具来判断内存是否泄漏,除此之外,我们可以在写代码时添加内存申请和释放的统计功能,来统计当前申请和释放的内存是否一致,从而来判断内存是否泄漏。

栈溢出

一般通俗来说,栈溢出就是由于递归或循环嵌套层次太多造成的。在平时的编程中,造成栈溢出的现象主要有以下几种:

(1)局部数组过大。当函数内部的数组过大时,有可能导致栈溢出。

(2)递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致栈溢出。例如,在解决斐波那契数列时,采用递归法求第1000项的斐波那契数时,往往会造成栈溢出。

(3)指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。

针对以上现象的解决办法有:一是增大栈空间,二是改用动态分配,使用堆(heap)而不是栈(stack)。

在这里插入图片描述

堆溢出

通常来说,导致堆溢出的操作是不断的new 一个对象,一直创建新的对象,但是不销毁。

栈溢出和堆溢出区别

栈溢出(Stack Overflow)和堆溢出(Heap Overflow)是两种不同类型的内存溢出问题,发生在计算机程序的不同内存区域。

栈溢出 (Stack Overflow):

  1. 发生位置: 栈(Stack)是用于存储函数调用和局部变量的内存区域。栈溢出指的是当函数调用的层次过深,导致栈空间不足时发生的问题。

  2. 原因: 通常由于递归函数调用过深或者函数调用没有正确的返回,导致栈空间耗尽。

  3. 特征: 常见的错误是堆栈溢出(Stack Overflow)异常,程序可能崩溃并显示类似 “Stack Overflow” 的错误消息。

  4. 修复: 避免无限递归调用,确保递归调用有正确的结束条件,或者增加栈的大小(这通常是通过调整操作系统或编译器的设置来完成)。

堆溢出 (Heap Overflow):

  1. 发生位置: 堆(Heap)是用于动态分配内存的区域,通常由 mallocfree 等函数管理。堆溢出指的是对动态分配的内存进行越界访问,或者写入超出分配内存范围的数据。

  2. 原因: 通常由于对已经释放的内存进行操作、数组越界、指针错误等问题引起。

  3. 特征: 堆溢出可能导致程序崩溃,或者在不同的时候产生不可预测的行为。它可能被利用成为安全漏洞的一部分,例如缓冲区溢出攻击。

  4. 修复: 使用动态分配的内存时,确保对内存的访问不越界,正确释放不再需要的内存。在C语言中,可以使用工具如Valgrind等来检测内存溢出问题。

总的来说,栈溢出和堆溢出都是由于对不同内存区域的错误使用而引起的问题。在编写程序时,要注意避免递归调用过深,确保栈的合理使用,同时在使用动态内存时要小心避免越界访问等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Matplotlib】基础设置之图像处理05

图像基础 导入相应的包: import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np %matplotlib inline导入图像 我们首先导入上面的图像,注意 matplotlib 默认只支持 PNG 格式的图像,我们可以使用 mpimg.im…

MySQL深入——9

如何正确的显示随机信息? 我们来模拟在英语单词app当中随机出现三个英语单词的情况,我们首先创建一张表words,然后给这个表当中插入10000条信息进行量化。 select word from words order by rand() limit 3; order by rand&…

基础数据结构第七期 Trie树

前言 Trie树大家能够掌握即可,其实用到的地方并不多,本文将为大家介绍一下。 一、Trie树的基本内容 1、根节点不包含字符,除根结点之外每一个结点都只包含一个字符; 2、字典树用边表示字母表示 3、从根节点到某一结点&#xff…

通过盲对抗性扰动实时击败基于DNN的流量分析系统

文章信息 论文题目:Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊(会议):30th USENIX Security Symposium 时间:2021 级别:CCF A 文章链接&…

Spring之代理模式

1、概念 1.1 介绍 二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中…

H266/VVC率失真优化与速率控制概述

率失真优化技术 率失真优化: 视频编码的主要目的是在保证一定视频质量的条件下尽量降低视频的编码比特率,或者在一定编码比特率限制条件下尽量地减小编码失真。在固定的编码框架下,为了应对不同的视频内容,往往有多种候选的编码方…

126基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法

基于matlab的孪生支持向量机(Twin support vector machine,TWSVM)是SVM的一种变形算法。该采用WSVM进行二分类,程序已注释数据可更换自己的,程序已调通,可直接运行。 126matlabTWSVM模式识别 (xiaohongshu.com)

【Python期末】动态爬取电影Top250数据可视化处理(有GUI界面/无数据库)

诚接计算机专业编程作业(C语言、C、Python、Java、HTML、JavaScript、Vue等),10/15R左右,如有需要请私信我,或者加我的企鹅号:1404293476 本文资源:https://download.csdn.net/download/weixin_47040861/88713693 目录…

模拟实现strlen函数的三种方法

本文介绍:模拟实现strlen函数的三种方法(指针相减,计数器,递归) 自我介绍:一个脑子不好的大一学生,c语言接触还没到半年,若涉及到效率等问题,各位都可以在评论区提出见解…

解决Typescript报错问题[亲测有效]

目录 1、安装 2、报错 3、分析 4、三种更新途径 如果你tsc -v报错,请看这篇文章,本人亲测有效! 1、安装 在前端项目中使用TS,需要进行安装,命令为:npm install -g typescript 查看TS版本: …

网关Gateway

什么是网关? 网关实质上是一个网络通向其他网络的 IP 地址,是当前微服务项目的"统一入口"。 网关能做什么? 反向代理 、鉴权、 流量控制、 熔断、 日志监控等 图片原文:http://t.csdnimg.cn/SvUJh 核心概念 Router(…

AArch64 memory management学习(一)

提示 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网参考文档为准。AArch64 memory management学习一共分为两章,这是第一…

GD32 支持IAP的bootloader开发,使用串口通过Ymodem协议传输固件(附代码)

资料下载: https://download.csdn.net/download/wouderw/88714985 一、概述 关于IAP的原理和Ymodem协议,本文不做任何论述,本文只论述bootloader如何使用串口通过Ymodem协议接收升级程序并进行IAP升级,以及bootloader和主程序两个工程的配置…

【算法提升】LeetCode每五日一总结【01/01--01/05】

文章目录 LeetCode每五日一总结【01/01--01/05】2023/12/31今日数据结构&#xff1a;二叉树的前/中/后 序遍历<非递归> 2024/01/01今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代码<非递归>今日数据结构&#xff1a;二叉树的 前/中/后 序遍历 三合一代…

Windows系统任务栏应用图标显示成空白的解决方案

背景 任务栏应用图标为空白&#xff1a; 原因 Windows系统为了加快系统响应速度&#xff0c;在安装完应用第一次显示完应用图标后&#xff0c;会将应用的图标放入缓存中&#xff0c;以后每次显示应用直接在缓存中获取&#xff0c;如果缓存中的图标信息发生错误&#xff0c;…

09-责任链模式-C语言实现

责任链模式&#xff1a;Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.&#xff08;使多个对象都有…

Java学习苦旅(二十三)——二叉搜索树

本篇博客将详细讲解二叉搜索树。 文章目录 二叉搜索树概念操作查找插入删除 性能分析 结尾 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根…

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

最新ChatGPT网站系统源码+详细搭建部署教程+Midjourney绘画AI绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

CogVLM多模态大模型训练代码详细教程(基于vscode调试与训练)

文章目录 前言一、cogvlm环境安装1、apex问题2、en_core_web_sm问题 二、launch.json文件配置1、finetune_cogvlm_lora.sh被配置内容2、launch.json文件配置3、debug调试展示 三、训练源码解读1、权重问题2、数据问题3、训练模型参数修改4、训练源码解读5、训练结果展示 前言 …