C++项目总结二之内存溢出

C++内存泄漏:原因、预防、定位 通过编写自定义的内存分析工具,可以在应用程序中插入代码来跟踪内存分配和释放的情况,从而帮助定位内存泄漏。 阅读详情

内存溢出用一个比较形象的比喻就好比向一个容量300ml的杯子中倒水。如果倒的水超出300ml,水就溢出。在程序中如果我们写入(或读取)数据的范围超出了变量的“容量”就可有可导致未知的程序行为。本方将从两个方面讨论内存溢出问题,一种是写入的数据超出变量“容量”;另一种是访问的数据超出变量范围,这种情况称为越界访问;大多数时候访问溢出内存区域不会造成程序异常行为。
一、字符处理函数使用不当
1.字符串strcpy
程序1:

#include <stdio.h>
#include <string.h>
int main()
{
    char    szBuf[5] = {0};
    strcpy(szBuf,"hello");
    return 0;
}

在上面的程序中,数组szBuf在栈上申请了5字节大小内存。strcpy拷贝了5个字符到szBuf中,由于c语言中字符串以’\0’结束。所以实际是向szBuf中写入了”hello”加’\0’共6个字节,而数组szBuf只占用了5字节;在vs2008 Debug模式下运行程序后提示我们变量szBuf数据损坏,如下图所示。如果我们的程序在运行过程出现了这种弹框提示,就说明我们的程序出现的溢出现象。这里写图片描述

图1

2、sprintf函数
在程序开发过程中,有时会将数据格式化输出到字符串缓冲区中。在我们的项目中有时对字符连接也会使用格式化输出函数。
程序2:

#include <stdio.h>
#include <string.h>
int main()
{
    int     iNum = 123;
    char    szBuf[5] = {0};
    sprintf(szBuf,"%d456",iNum);
    return 0;
}

在上面的程序中我们将整型iNum格式化后与字符串”456”一起生成字符串”123456”。然后将字符串”123456”存放到szBuf缓冲区中。而szBuf只有5个字节大小,在vs2008中运行上面程序,会报如图1类似的提示内存溢出提示。
3、memcpy函数使用不当
在我们做的一个项目中需要获取网卡的连接名称。网卡连接名称是通过系统API函数调用,获取的网卡连接名称放到一个系统的结构体变量中,然后再将网卡名使用memcpy拷贝到局部变量中,程序大致如下:
程序3:

#include <stdio.h>
#include <string.h>
int main()
{
    char    szBuf[64] = {0};
    //为了简化假设已获取的网卡名称已存入到szNetcarName中
    char    szNetcarName[128] ;
    memcpy(szBuf,szNetcarName,strlen(szNetcarName));
    return 0;
}

上面的程序隐患很隐蔽,并且程序大部分情况下都能正常运行。直接有一天在一台装了虚拟机的电脑上运行该系统时。程序突然崩溃,后来通过定位发现原来装的虚拟网卡有一网卡名称有100个字符左右。我们的szBuf才64字符,我们给memcpy的第三个参数传入的参数是strlen(szNetcarName),这时就会向szBuf写入100个字符左右,造成内存溢出,程序崩溃。
对于不安全字符串处理函数造成的内存溢出可以使用下面的解决办法:1.使用编译器,或标准库中具有相同功能的安全函数,如strcpy替换成strncpy。2.使用c++的stl string或者开源的第三方字符串处理类,如tinyxml的TiXmlString。3.自己编写字符处理的类
二、循环变量使用不当
1.循环变量数据类型
程序4:

#include <stdio.h>
#include <stdio.h>
#include <string.h>
void func(char *szBuf)
{
    for(unsigned int i=strlen(szBuf)-1;i>=0;i--)
    {
        if(szBuf[i]>='A' && szBuf[i]<='Z')
        {
            szBuf[i] -= 32;
        }
    }
}
int main()
{
    func("hello");
    return 0;
}

上面的程序两处问题:1.如果传给func的字符串是个空串,由于在for循环中定义的i是unsigned int型;unsigned int取值范围为[0,0xFFFFFFFF],所以在for循环中i>=0这个判断条件会一直成立。2.如果传给func的函数的参数是空串,i=strlen(szBuf)-1的值为-1(在内存的表示为0xFFFFFFFF),由i是unsigned int型,所以在循环体中执行szBuf[i]时会出现访问数组下标为0xFFFFFFFF情况,造成程序异常退出。
2.循环判断条件
程序5:

#include <stdio.h>
#include <string.h>
void EncodeBase64(char *szBuf,char *szSource)
{
    int i=0;
    int j=0;
    for(i=0;i<1021;i+=4)
    {
        for(j=0;j<strlen(szSource)/3;j+=3)
        {
            //将字节编码编码成字节,编码后的字节分别放在szBuf[i],szBuf[i+1],szBuf[i+2],szBuf[i+3]中。
        }
    }
    //处理szSource乘余的字节
}
int main()
{
    char szBuf[1022] = {0};
    EncodeBase64(szBuf,"ABCDEF");
    return 0;
}

上面程序是对字符串进行base64编码。在EncodeBase64函数的外层循环中,判断szBuf可使用的下标范围。分析下程序5中的外层循环,假如待加密字符串足够长,i每次增加4,执行255次循环后,i的值是1020;此时i<1021,程序继续执行,经过base64加密后的4字节数据分别存放在1020,1021,1022,1023处,这样就会造成内存溢出。如果1022,1023处存放的是函数返回地址,程序就会出现诡异的情况(后面我们会做一个简单的实验,通过内存溢出实现函数诡异调用)。

【Opencv学习(二)】内存溢出和内存泄漏总结 内存溢出原因总结: 1. 图像载入路径出错。 在Opencv中,图像载入路径用双斜杠,例如:"D: \\ my_image.jpg". 2. 如果确认图像载入路径完全正确,那么应该考虑载入图片的深度,是什么样的图像类型。具体的类型应该是和你下面所用到的函数有关,一般而言,函数所需的输入图像格式应该和你载入的图像格式一致,否则也会出现内存溢出。 3. 在写读大量图片时,例如:发 阅读详情

相关推荐

C++检查内存溢出的方法

一:   ps vx| grep 进程号 ----看size和rss段是否在增加。   方法二: http://www.ibm.com/developerworks/cn/aix/library/au-mallocdebug.html 如果是AIX服务器 : 引言 在编写应用程序时进行动态内存分配是非常必要的。它可以在程序运行的过程中帮助分配所需的内

August_1989 7120

C++内存溢出,看高级程序员的解决办法是什么

C/C++语言中,内存的分配与回收都是由开发人员在编写代码时主动完成的,好处是内存管理的开销较小,程序拥有更高的执行效率;弊端是依赖于开发者的水平,随着代码规模的扩大,极容易遗漏释放内存的步骤,或者一些不规范的编程可能会使程序具有安全隐患。如果对内存管理不当,可能导致程序中存在内存缺陷,甚至会在运行时产生内存故障错误。 内存泄漏是各类缺陷中十分棘手的一种,对系统的稳定运行威胁较大。当动态分配的内存在程序结束之前没有被回收时,则发生了内存泄漏。由于系统软件,如操作系统、编译器、开发环境等都是由C/C++语言

apple_51669768的博客 2775

C++内存机制中内存泄露、内存溢出、内存越界和内存泄漏原因分析

在用C++做底层驱动时,经常会遇到内存不足的警告,往往是因为内存出现溢出、泄露或者越界等原因。 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用。 内存泄漏(memory leak) 是指程序申请的内存,用完后没有释放已申请的内存空间,占用有用内存。 二者关系:内存泄漏的堆积最终会导致内存溢出内存溢出,就是你要的内存空间超过了系统实际分配给你...

随心漂流的博客 2206

C++编程中内存溢出问题

转载自另一篇博客:http://blog.chinaunix.net/uid-8318378-id-2032222.html 1.        良好的编程习惯是预防内存漏洞的根本 2.       正确申请和释放内存空间。 3.       记得在每个可能的出口检查指针 一、为什么会出现内存溢出问题? 导致内存溢出问题的原因有

Esther_lq的博客 5901

VS2017的C++开发心得(十二)调试——内存溢出和内存泄漏(中)

这篇要做一点改变,本来计划是怎么debug内存溢出,但由于内存溢出的方式各种各样,没有固定的debug方式,调试手段随机应变。所以这篇主要从内存分布来理解内存溢出问题,以及内存溢出可能造成的后果。 首先看看结构体的内存分布,代码如下: #include &lt;Windows.h&gt; struct SA { double dArray[2]; int t; SA() { F...

luoyu510183的博客 5452

离线安装ambari 更换spark版本 集成carbondate文档

1、Linux系统环境配置 1.1 配置IP地址 vim /etc/sysconfig/network-script/ifcfg-eth0 “DEVICE”:网卡对应的设备别名,如ifcfg-eth0第一块网卡; “HWADDR”:网卡物理地址; “BOOTPROTO”:网卡获得ip地址的方式,Static(静态 ip地址)dhcp(通过dhcp协议获取ip)bootip通过boot...

weixin_44742962的博客 3036

C++ 内存管理中内存泄漏问题产生原因以及解决方法

C++内存管理中内存泄露(memory leak)一般指的是程序在申请内存后,无法释放已经申请的内存空间,内存泄露的积累往往会导致内存溢出。

weixin_42492218的博客 3049

别再为倍福EL6021/EL6022的RS485接线头疼了!手把手教你硬件跳线与软件配置(附Modbus RTU主站例程)

本文详细解析了倍福EL6021/EL6022模块的RS485硬件跳线与软件配置方法,包括Modbus RTU主站编程实战。从端子定义、跳线操作到TwinCAT 3环境设置,提供完整的通信例程和故障排查技巧,帮助工程师快速解决工业现场通信问题。

weixin_30634661的博客 590

C++溢出总结

最近在做leetcode整数反转的题,让判断integer是否溢出。查了一些资料,做一些溢出判断总结: 1. 设置一个long型变量存储结果。判断 是否< INT_MIN 或者 > INT_MAX。 2. 保持使用int, 乘 加 之前判断是否溢出 if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0; if (rev < INT_MIN/10 || (rev =..

weixin_40827685的博客 3396

Docker小白也能搞定!5分钟用calibre-web搭建私人Kindle书库(附静读天下配置)

本文为零基础用户提供了一份详尽的指南,介绍如何利用Docker容器技术,在5分钟内快速部署Calibre-Web服务,从而搭建一个完全私有的个人Kindle书库。教程涵盖了从Docker安装、Calibre-Web一键部署、书籍元数据管理到移动端配置的全流程,并重点讲解了如何与安卓端知名阅读应用“静读天下”联动,实现跨设备无缝访问,打造媲美在线书城的个性化阅读体验。

weixin_29216957的博客 541

SAP接口错误查询日志

随着数字经济的迅速发展,企业数字化转型不在只追求“业财一体化”,而是在业务端也想要进行更为精细化的管理,所以很多企业在SAP ERP的基础上,集成更多垂直领域更精细的外围系统,比如销售CRM系统,采购SRM系统,生产MES系统等等,琳琅满目的产品,那对SAP实施来说,系统集成过程中,接口的一些报错查询能力必不可少,今天我们就介绍一下,SAP和CRM系统集成中接口常见的报错。

weixin_43657667的博客 2047

C++中内存泄漏,内存溢出区别及检查方法

c/c++中内存泄露和内存溢出的区别 内存泄漏的几种情况: 1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 两种情况下会出现这种内存泄露:一是在堆里创建了对象占用了内存,但是没有显示地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存 2.没有正确地清除嵌套的对象指针 3.在释放对象数组时在delete中没有使用方括号 方括号是告诉编译器这个指针指向的是一个对象数组,同时也告诉编译器正确的对象地址值并...

顺其自然~专栏 4899

手把手教你搞定JBI投稿:从Statement of Significance到Declaration Statement的保姆级避坑指南

本文提供了一份详细的JBI投稿指南,重点解析Statement of Significance和Declaration of Interests的撰写技巧,帮助研究者避开常见格式陷阱。通过实战案例和检查清单,确保投稿符合JBI的学术严谨性和临床转化价值要求,提升稿件通过率。

weixin_29278805的博客 622

C++ 内存溢出&内存泄漏

内存溢出(OutOfMemory)是指程序申请内存时,没有足够的内存供申请者使用。 内存溢出的原因:1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据。 2.集合类中有对象的引用,使用完后为清空,使得不能回收。 3.代码中存在死循环或循环产生过多重复的对象实体。 内存...

AiChiMomo的博客 1815

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 549

C++项目集成7zip-cpp:现代封装库实现高效文件压缩解压

文件压缩与解压是数据处理和存储中的基础技术,通过算法减少文件体积,提升传输效率和节省存储空间。其核心原理包括字典编码、熵编码等,在数据备份、软件分发、资源管理等场景中广泛应用。7-Zip作为业界知名的开源压缩工具,以其高压缩率和多格式支持著称,但其原生COM接口复杂难用。7zip-cpp库通过C++封装层,将底层COM API转化为符合现代C++习惯的面向对象接口,极大简化了集成流程。该库支持CMake构建系统,提供极简的API设计,如SevenZipCompressor和SevenZipExtractor

weixin_30251829的博客 378

VMware16虚拟机:安装Windows10系统---超详细教程

VMware16虚拟机:安装Windows10系统---超详细教程

MQ0522的博客 3万+

数组的下标越界与内存溢出

很相似的两个概念,一不小心就会混淆首先,对两个名词做一个大概的解释: 下标越界 在引用数组元素时,使用的下标超过了该数组下标的应有范围,但应注意的是: C/C++不对数组做边界检查。 可以重写数组的每一端,并写入一些其他变量的数组或者甚至是写入程序的代码。不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这

ljx_5489464的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c++ 内存溢出以及整数溢出

先说一下概念: 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用。 内存泄漏(memory leak) 是指程序在申请内存后,无法释放已申请的内存空间,占用有用内存。 并且:内存泄漏最终会导致内存溢出。 通俗的说溢出,是因为分配的内存,系统无法提供这么多内存、内存泄漏是咱们new ,还不delete。 下面截取一下其他博主对内存泄漏的分类 内存泄漏可分为4类: 1.常发性内存泄漏 引起内存泄漏的代码会被很多次执行,每次执行的时候都会导致内存泄漏.

qq_60567866的博客 972

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++编程中如何防止内存溢出问题 _c++中全局变量很多,怎么不会超出空间

当你用 C/C++ 书写代码时,应该处处留意如何处理来自用户的数据。(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。(3) 编译器设置的内存缓冲区太靠近关键数据结构。不要太悲观,下面讨论内存溢出问题的解决和预防措施。(2) 以不可靠的方式存取或者复制内存缓冲区。必须知道内存缓冲区的总长度。二、解决内存溢出问题。

2401_84976619的博客 516

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C++中内存泄漏,内存溢出区别

C++中内存泄漏,内存溢出区别

qq_33300585的博客 1247

C++编程中如何防止内存溢出问题?

1. 良好的编程习惯是预防内存漏洞的根本 2. 正确申请和释放内存空间。 3. 记得在每个可能的出口检查指针 一、为什么会出现内存溢出问题? 导致内存溢出问题的原因有很多,比如: (1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。 (2) 以不可靠的方式存取或者复制内存缓冲区。 (3) 编译器设置的内存缓冲区太靠近关键数据结构。 下面

klzhang的专栏 7772

转载--C/C++中容易造成内存溢出的函数

转载--C/C++中容易造成内存溢出的函数 2011年01月05日   C/C++中容易造成内存溢出的函数   1.strcpy()   strcpy()函数将源字符串复制到缓冲区。没有指定要复制字符的具体数目。复制字符的数目直接取决于源字符串中的数目。如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会陷入大的麻烦中!   建议使用strncpy.   2.strca...

ejs90ejs 301

内存溢出

http://baike.baidu.com/view/79183.htm 内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,象在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。 如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大

miyunhong的专栏 8081
上一篇: C++项目总结一之内存泄漏检测
下一篇: C++项目总结三之内存泄漏
mxway
博客等级 码龄17年 370粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值