【高质量C++/C总结7】内存管理——常见的内存错误及对策

彻底解决Windows内存读写错误100% 内存错误是计算机系统中常见且棘手的问题,它可以导致系统崩溃、数据丢失甚至硬件损坏。理解内存错误的含义及其影响,是解决此类问题的第一步。本章将概述内存错误的本质及其对系统稳定性和性能的潜在威胁。内存错误通常指的是计算机内存组件中发生的故障或不正确的行为,包括但不限于内存泄漏、数据损坏、寻址错误等。它们可以被分为逻辑错误和物理错误两大类。逻辑错误一般由软件问题引起,比如程序代码缺陷或系统配置不当。物理错误则通常与硬件故障有关,例如内存条损坏或接触不良。 阅读详情

说在开始:

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

常见内存错误和对策

此部分主要参考的林锐的C++程序设计,其中加入了我个人的理解。

我自己在写程序过程中也经常遇到内存错误,深有体会,这些错误在程序中不容易发现,在不同的平台上产生的结果也是不同的,这里就对常见的内存错误进行总结。

(1)内存有可能会分配不成功

在动态申请内存时,有可能会申请失败。解决办法:在使用内存之前,检查指针是否为NULL。如以下代码:

assert(p!=NULL)
//或者
if(p==NULL)
//或者
if(p!=NULL)

(2)内存分配虽然成功,但是尚未初始化就使用它。此句话可能比较不好理解,看以下的代码:

int main()
{
	int *p = new int[2];
	cout << p[0] << endl;//垃圾值
	p[0] = 2;
	cout << p[0] << endl;//2
	delete [] p;
}

p指向的内存分配成功,但是没有初始化值,打印后是垃圾值,初始化才可以使用。造成这个现象的原因有两个:(1)没有初始化的意识,在C++中初始化、定义是严格区分的。(2)误认为分配得到的内存中的值为0。

C++对动态内存的初值究竟是什么没有做出统一的规定,尽管有些时候会自动初始化为0,但是我们应该潜意识的设置其初值。这是一个很好的编程习惯,无论是用什么方式创建数组,都别忘了给定初值。即便是NULL或者0,千万别因小失大。指针定义的时候就给定NULL是最好的选择。

(3)内存分配成功而且已经初始化,但是超过了使用界限

内存使用越界很容易出现错误,例如数组下标越界等等。好的编译器会帮你检查,但是还是需要自己注意。

(4)忘记释放内存,或者只释放了部分内存造成内存泄漏

在使用new/malloc申请内存后千万记得使用户delete/free进行内存的释放,对内存数组释放时记得使用delete [] p。如果忘记释放内存,那么程序占用内存会越来越多,直到内存耗尽。

(5)释放内存后还在继续使用

a.程序中对象关系比较复杂时,那就说明代码的结构有问题,需要重新梳理,改变混乱的局面。

b.不要return栈内存的指针或者引用,该内存在函数结束时自动释放,毫无意义,如下段代码

Object& function()
{
    Object ob;
    return ob;
}

c.free或者delete内存后,没有将内存指针设置为NULL,形成野指针。

d.多次释放同一块内存。

实际开发中需要注意的内存问题

以下是我开发过程中遇到的问题。

(1)在释放内存后,一定要将指针设置为NULL,否则他人使用时容易出现错误。

(2)在循环语句中,注意内存申请和释放问题。

(3)函数参数是指针时,函数会对形参指针进行拷贝,返回指针指向的内存时应当注意。

iOS自动化之打包-xcodebuild命令行打包.app并安装到ios模拟器 xcode xcodebuild xcrun ios模拟器 iOS UI自动化测试 ios自动打包安装到ios模拟器 阅读详情

相关推荐

地质工程师必备:Dips软件从数据导入到主结构面分析的完整流程解析

本文详细解析了地质工程师使用Dips软件进行主结构面分析的完整流程。从数据准备与导入、结构面分组与扇形区划分,到主结构面计算与工程解读,系统阐述了如何将野外节理数据转化为控制岩体稳定性的关键信息。重点介绍了利用等值线图识别优势组、计算统计主值及其置信椭圆,并强调了地质判断与工程应用结合的重要性。

table的专栏 341

为什么你的C程序总崩溃?7个内存管理错误自查清单

在C语言编程中,内存管理是一个核心且复杂的部分。合理的内存管理能够确保程序高效、稳定地运行,而一旦出现内存管理错误,程序就可能会崩溃、产生不可预期的结果或者造成内存泄漏。本文将详细介绍C程序中常见的7个内存管理错误,并给出相应的自查方法和解决方案,帮助技术人员更好地排查和解决问题。

星辰夜语的博客 964

案例分析|一篇文章带你看懂养鸡场智慧管理系统

养鸡场智慧管理系统是为了满足现代化养鸡业对精细化管理的需求而设计的一款专业软件。随着科技的发展和农业产业的升级,传统的手工记录和管理方式已无法满足高效、准确和实时的数据跟踪需求。本软件旨在通过集成各种功能模块,帮助养鸡场主实现从鸡苗孵化、饲养管理、饲料控制到销售结算等全链条的智能化操作。该系统的核心目标是提升养鸡场的运营效率和盈利能力,通过自动化数据处理,减少人工误差,节省时间和精力。例如,孵化报表和记录模块可以帮助管理者实时监控孵化过程,及时调整策略;

muyu2980的专栏 930

我遇到了.Net开发中10种常见的内存错误,并且找到了对应的解决方案

在软件开发过程中,内存错误是一类常见而又令人头疼的问题。在.Net开发中,为内存管理方面提供了许多便利,但仍然存在一些常见的错误和陷阱。这些错误可能导致内存泄漏、性能下降、异常抛出等问题,严重影响应用程序的稳定性和性能。如果需要管理的对象更复杂,可以考虑实现一个自定义的对象池。例如,当频繁操作一些非数组的大对象时,可以使用类,或者借助一些第三方库(如)来实现。// 从对象池中租借 StringBuilder 对象");// 打印并返回对象// 清空内容// 将对象归还给池。

dotnet研习社 1426

Codesys电子凸轮从入门到应用:手把手教你用MC_CamIn/MC_CamOut实现主从轴同步

本文详细介绍了如何在Codesys平台上使用MC_CamIn和MC_CamOut功能块实现电子凸轮的主从轴同步控制。从环境配置、轴使能到凸轮表创建与动态切换,提供了完整的程序编写指南和调试技巧,帮助工程师快速掌握工业自动化中的高精度运动控制技术。

weixin_26878995的博客 276

faster lio 回环 加入GTSAM优化的记录

对Faster lio 加入回环、gtsam优化,在室外建图遇到的问题和过程

Nico_jion的博客 2599

C生万物 | 常见的六种动态内存错误

本文重点介绍C语言中的6种常见动态内存错误,带你规避致命错误

做技术人 · 产优质博客 · 找好工作 1417

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

内存管理及错误分析

指针操作内存,防范野指针、内存申请与释放。

weixin_45258382的博客 666

kaggle学习笔记-餐厅数据挖掘

分析Zomato数据集的基本思想是为了公平地了解影响在班加罗尔不同地方建立不同类型餐厅的因素,每个餐厅的总评级,班加罗尔是这样一个城市,拥有超过12,000家餐厅,餐厅供应来自世界各地的菜肴。每天都有新的餐馆开业,这个行业还没有饱和,需求也在与日俱增。然而,尽管需求不断增加,新餐馆却很难与老牌餐馆竞争。大多数餐厅都供应同样的食物。班加罗尔是印度的IT之都。这里的大多数人主要依靠餐馆的食物,因为他们没有时间自己做饭。由于对餐馆的需求如此巨大,因此研究一个地方的人口统计学就变得很重要。

优快云XXCQ的博客 1862

基于VSCode+clangd插件打造高效C++开发环境之四:clangd配置

本文介绍如何配置VSCode+clangd插件进行高效C++开发。重点内容包括:1)生成compile_commands.json文件,通过ninja工具提取编译命令并使用gen_compdb脚本转换;2)配置clangd命令行参数,如设置后台索引、并行度等;3)编写.clangd配置文件,调整编译标志和诊断选项;4)添加.clang-format文件定义代码风格;5)在VSCode中添加远程服务器工作目录。配置完成后需重启clangd服务使更改生效。文章还提供了MTK/QCOM等不同平台生成compile

5069

读书笔记-高质量C++/C编程指南-第7章 内存管理

  【序】最近痛下决心要好好学习下C和C++,以为即将来临的求职做点准备,在网上搜野指针的问题时看到了《高质量C++/C编程指南》,对于我这种想从事嵌入式开发的人来说,犹如收获到一本编程的bible似的。此文对C和C++编程的风格及注意事项进行了精妙的分析,集合了Thinking in C++、Effective C++等经典书籍的主要内容,实乃至宝啊本人对此文进行了研读,红色部分是我

Sailor_forever 1580

手把手教你学Simulink实例:基于Simulink的锂电池管理系统(BMS)仿真

是确保锂电池安全、高效运行的关键组件。BMS 主要功能包括监控电池的状态(如电压、电流、温度)、估算荷电状态(State of Charge, SOC)、健康状态(State of Health, SOH),以及实现电池均衡和保护机制等。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证锂电池管理系统的控制策略。常见的均衡方法包括被动均衡(通过电阻放电)和主动均衡(通过开关电容或变压器)。通过本教程,我们详细介绍了如何使用 Simulink 进行锂电池管理系统的仿真实例。

MHD0815的博客 538

高质量C++/C编程指南

高质量C++/C编程指南文件状态[  ] 草稿文件[√] 正式文件[  ] 更改正式文件文件标识:当前版本:1.0作    者:林锐博士完成日期:2001年7月24日版本历史版本/状态作者参与者起止日期备注V 0.9草稿文件林锐2001-7-1至2001-7-18林锐起草V 1.0正式文件林锐2001-7-18至2001-7-24朱洪海审查V 0.

QQ125864255的专栏 2577

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

高质量C++/C编程指南(七)内存管理

一、内存的分配方式 二、常见的内存错误及其对策 三、指针参数是如何传递内存的? 1、如果非得要用指针参数去申请内存,那么应该用“指向指针的指针”。 2、用函数返回值来传递动态内存 四、free和delete把指针怎么啦? 五、动态内存会被自动释放吗? 六、杜绝“野指针' 七、内存耗尽怎么办? 八、malloc/free的使用要点 1、malloc 2、free 九、new/delete的使用要点 1、new 2、delete 十、一些心得体会

Exp.Joker 749

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

高质量C++/C编程指南 -- 第7章 内存管理 (1)

高质量C++/C编程指南 -- 第7章 内存管理 (1)程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本章的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。7.1内存分配方式内存分配方式有三种:(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内

tattarrattat的专栏 1067

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【高质量C/C++】7.内存管理

高质量C/C++编程,教你写出高质量代码,避免内存管理的坑。

weixin_52811588的博客 836

高质量c++/c编程指南—内存管理篇

以下是阿鲤对高质量c++/c编程指南的读书笔记及自己的理解,分享出来希望对大家有用。这里是第七章的内容: 1:内存的分配方式。 2:常见的内存错误及其对策。 3:指针与数组的对比。 4:指针参数是如何传递内存的? 5:free和delete把指针怎么啦? 6:动态内存会自带释放吗? 7:杜绝“野指针” 8:有了malloc/free为什么还要new/delete 9:内存耗尽怎么...

belongHWL的博客 332

高质量C++/C编程指南 -- 第7章 内存管理

zzy5177的专栏 274

高质量 C++/C 编程指南笔记——C语言部分【附带电子书】

对林锐博士的高质量 C++/C 编程指南的C语言部分做的笔记和提炼。

The_bad的博客 2375

学习笔记之高质量C++/C编程指南

高质量C++/C编程指南 http://man.lupaworld.com/content/develop/c&c++/c/c.htm 高质量C++/C编程指南(附录 C :C++/C 试题的答案与评分标准) http://www.warting.com/program/201111/38402.html http://www.360doc.com/content/10...

weixin_34221112的博客 441

高质量C++/C编程指南 林锐

      高质量C++/C编程指南     文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件

ant_ma的专栏 2500
上一篇: 【高质量C++/C总结6】内存管理——堆(stack)栈(heap)
下一篇: 【高质量C++/C总结8】内存管理——指针参数传递内存
尹豆(douysu)
博客等级 码龄9年 151粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值