C++项目总结三之内存泄漏

C++内存泄漏及解决方法 1.首先说到c++内存泄漏时要知道它的含义? 内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 2.内存泄漏的后果?  最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。 只发生一次的小的内 阅读详情

这篇文章简单讨论下c++中的内存泄漏问题。在本例中需要用到第一篇中关于内存泄漏检测的头文件,用来辅助检测程序中的内存泄漏情况。

1.只分配不释放

程序1:

#include <stdio.h>
#include <string.h>
#include "common.h"
int main()
{
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
    int *p = (int*)malloc(sizeof(int));
    int *q = new int;
    return 0;
}

上面程序中分别使用malloc和new分配了两个int型内存。但没有对动态分配的内存进行释放。程序运行结束,在vs2008输出窗口输出如下信息
这里写图片描述

2.分支引起的内存未释放

程序2:

#include <stdio.h>
#include <string.h>
#include "common.h"
void func(int flag)
{
    int *p = new int;
    if(flag)
    {
        return;
    }
    delete p;
}
int main()
{
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
    func(1);
    return 0;
}

上面的程序中,在func中我们动态分配的内存空间,在程序最后使用delete p;释放了内存。但上面程序运行结束后会在vs2008输出窗口提示我们func中的int *p = new int;分配的空间没有释放。简单分析下是由于程序中判断了参数flag的值,如果为真,程序就直接返回。后面的释放代码就无法执行了。其实上面的func代码比较简单,所以还是比较容易能找到原因。但在实际开发中功能比较复杂,判断复杂,有时并不太容易发现内存泄漏。并且有时内存泄漏的情况只有在特定条件下才会发生,如上面的程序。如果func传的参数值一直都是0 ,那么内存泄漏永远都不会发生。

3.异常情况引起的内存泄漏

程序3:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include "common.h"
void func(int iNum)
{
    int iVal = 100;
    int *p = new int;
    if(iNum==0)
    {
        throw std::exception("除数为0");
    }
    *p = iVal/iNum;
    delete p;
}
int main()
{
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
    try
    {
        func(0);
    }
    catch(...)
    {

    }
    return 0;
}

上面的程序执行完成后会提示第8行分配的内存没有释放。这是因为我们在func函数判断当iNum==0时,抛出一个异常,这时程序会返回到main函数中进行处理,func最后两句就不会再被执行,从而导致内存泄漏。上面的程序我们完全可以在判断iNum==0的时候执行释放语句。程序这么只是简单的模拟,因为在实际开发中,我们不可能判断出所有的异常情况。对于比较有可能发生异常的函数内,我们尽量不要动态分配内存空间;在必须要动态分配内存的情况下,如果处理的是字符串,那么使用stl string或第三方开源c++字符串处理类的对象来实现;如果是为对象分配动态空间,使用智能指针来管理对象指针,因为C++保证在发生异常时,局部对象的析构函数一定会被调用。

4.继承引起的内存泄漏

在我做的保密检查工具中需要对ntfs及fat32文件系统中被删除的文件进行恢复。程序大致结构如下:
程序4:

class CFileSystem
{

};
class CFat32FileSystem:public CFileSystem
{

};
class CNtfsFileSystem:public CFileSystem
{
public:
    CNtfsFileSystem()
    {
        m_bitmap = new(xxxx);
    }
    ~CNtfsFileSystem()
    {
        delete m_bitmap;
    }
private:
    char *m_bitmap;
};

ntfs中的m_bitmap是用于记录分区中哪些扇区已被使用,哪些扇区是空闲的。该功能的使用大致如下:

CFileSystem *fileSystem = new CNtfsFileSystem;
delete fileSystem;

父类指针对象指向子类,这样无论子类是ntfs或者fat32。操作接口都是统一的。使用完后删除父类指针所指对象。后面在测试过中发现使用该功能,程序的内存会一直不停增长;后面分析发现虽然调用了delete fileSystem;但并没有调用CNtfsFileSystem的析构函数。这是由于我们没有把基类CFileSystem的析构函数定义成函数,这样执行delete语句只调用了父类的析构函数,没有调用子类CNtfsSystem的析构函数;造成了子类m_bitmap分配的空间没有释放。所以在编写一个类的时候,除非我们确定该类不会被继承,否则最好将该类的析构函数定义成虚函数。

5.指针类型转换引起的内存泄漏

#include <stdio.h>
#include <string.h>
#include "common.h"
using namespace std;
class A
{
public:
    A(){p = new char[1024];}
    ~A(){delete p;}
private:
    char *p ;
};
int main()
{
    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CRTDBG_ALLOC_MEM_DF);
    void *p = new A;
    delete p;
    return 0;
}

上面的程序定义了一个类A,在A的无参构造函数中给成员变量p动态分配了1024字节。在main函数中使用new创建一个A的对象,p指向新创建的对象。上面程序运行完成后却提示我们程序中有内存泄露。如下图
这里写图片描述
看下上面的main函数中,将p定义成了void*型,这样p可以指向任意的指针类型;执行delete p语句首先删除p所分配的空间,然后p是void *型,所以不会调用p所指向的真实类型的析构函数。上面的程序释放了分配类A的对象所占用空间,但是对于类A对象的成员在构造时动态分配的内存没有释放。从而产生内存泄漏。

C++ 内存泄漏-原因、避免、定位 大家好!作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成或者。今天,借助此文,分析下项目中经常遇到的导致内存泄漏的原因,以及如何避免和定位内存泄漏。 阅读详情

相关推荐

浅谈C++中内存泄漏的检测

首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况:一. 在 MFC 中检测内存泄漏假如是用MFC的程序的话,很简单。默认的就有内存泄露检测的功能。

1万+

C++中内存泄露的几种情况?

C++中内存泄露的几种情况?

weixin_46319994的博客 502

C/C++内存泄漏及检测

wikipedia中这样定义内存泄漏:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。最难捉摸也最难检测到的错误之一是内存泄漏,即未能正确释放以前分配的内存的 bug。只发生一次的小的内存泄漏可能不会被注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种征兆:从性能不良(并且逐渐降低)到内存完全用尽。

A19720252059的博客 1767

【C/C++】常见问题之内存泄露

C/C++是一种常见的编程语言,其直接管理内存的特性,使其更加容易出现内存泄漏问题。本篇博客将详细介绍C/C++中的内存泄漏问题,包括内存泄漏的概念、原因、影响以及预防内存泄漏的方法。

crr411422的博客 3600

【C++】【VLD】VLD检测内存泄漏

VLD(全称:Visual Leak Detector)是一款用于 Visual C++ 的免费内存泄露检测工具。与其它内存检测工具相比,它在检测到内存泄漏的同时,还具有如下特点:可得到内存泄漏点的调用堆栈,以及其所在文件及行号;可得到泄露内存的完整数据;可设置内存泄露报告的级别;提供了打包好的 lib 库,使用时无须编译源码,直接使用即可;源码使用 GNU 许可发布,并有详尽的文档及注释。对于想深入了解堆内存管理的读者,是一个不错的选择。

qq_43331089的博客 3340

【C++内存泄漏】引发C++程序内存泄漏的原因分析与排查内存泄漏的方法总结

本文根据多年的项目实践以及遇到的多个内存泄漏的问题案例及场景,详细介绍引发内存泄漏的原因以及排查方法。

dvlinker的技术专栏 4万+

工作中常见的几种内存泄漏场景汇总

内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 作为C/C++程序员,谁还不写Bug,Bug里面的王者要数内存泄漏,内存泄漏具有其独有的属性,比如说:隐蔽性强、难以排查、占用资源不断累积等特点,更甚者是会让人想要摔键盘…… 本文主要是对工作中经常遇到的内存泄漏场景进行总结,与君共勉。 1、在构造函数中抛出异常 class Test{public: Test(int iFlag.

liudan319的专栏 1526

【C++内存泄漏】使用Visual Leak Detector排查内存泄漏问题

本文详细讲述使用Visual Leak Detector排查内存泄漏的完整过程。

dvlinker的技术专栏 2万+

C++的内存泄漏

C++内存泄漏的情况 C++中内存泄漏的几种情况 1. 在类的构造函数和析构函数中没有匹配的调用new和delete函数 在堆里创建对象占用了内存,但是没有显示地释放对象占用的内存 在类的构造函数中动态地分配了内存,但是在析构函数中没有释放内存或者没有正确地释放内存 2. 没有正确地清除嵌套的对象指针 3. 在释放对象数组时delete没有使用方括号 4. 指向对象的指针数组不等同于对象数组 5. 缺少拷贝构造函数 6. 缺少重载赋值运算符 7. 关于nonmodifying运算符重载的常

jiangchao98的博客 1283

【C++内存泄漏】使用Windbg排查C++程序内存泄漏问题

详细讲述如何使用Windbg去定位Windows C++程序中的内存泄漏。

dvlinker的技术专栏 1万+

【41】C++实战篇——VS2022检测程序内存泄漏, C++内存泄漏检测工具VLD(Visual Leak Detector),打印C++内存泄漏报告,找具体内存泄漏位置

本文介绍了如何使用Visual Leak Detector(VLD)工具检测C++程序中的内存泄漏问题。主要内容包括:1)VLD工具的下载与安装配置方法,需将相关库文件和头文件添加到项目中;2)在Debug模式下运行程序,VLD会生成详细的内存泄漏报告,包括泄漏位置、大小和调用栈信息;3)通过实际案例展示了泄漏报告的分析方法,可快速定位问题函数。该工具能有效解决C++项目运行中内存不断增长、速度变慢的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1815

C++内存泄露几种常见原因

在cpp编程中,产生内存泄漏的主要原因是利用malloc或者new等分配内存的方式申请内存后,由于主观或者客观原因没有进行释放,导致申请的内存区域没有及时得到释放导致的。 下面对几种常见/特殊的情况进行简单记录。 1. 析构函数中未匹配地释放内存 2. 基类的析构函数没有设为虚函数, 由于基类的析构函数不是虚函数,在实现多态时,通过delete删除指向派生类的基类指针时,派生类的析构函数被覆盖无法调用,而是调用的基类的析构函数,导致派生类对象无法被释放,导致内存泄漏。 3. 关于指针数组释放 对

jusu10的博客 6499

触摸延时灯课程设计

Multisim源文件下载: 实验名称:­­­­­­­­­­­­­­­­­­­ 课程设计1:触摸延时灯仿真设计 设计要求: 利用单稳态触发器设计触控延时灯,要求利用触发波形的边沿模拟触控点实现触发,触发后3秒灯亮,灯可以亮的时间可在5-10秒之间可调。 设计思路: 利用集成单稳态触发器CD4098设计简易的触摸延时灯电路。应用CD4098可以实现脉冲延时,原理图如下。4脚未触发信号输入端,可通过比较器对触摸产生的信号进行比较后再产生触发信号,使触发准确度得以提高。...

m0_54240221的博客 1万+

如何监测内存泄漏

如何监测内存泄漏文摘内容: 版权申明本文可以被自由转载,但是必须遵循如下版权约定:1、保留本约定,并保留在文章的开头部分。2、不能任意修改文章内容,或者删节,增加。如果认为本文内容有不当之处需要修改,请与作者联系。3、不能摘抄本文的内容,必须全文发表或者引用。4、必须保留作者署名、注明文章出处。(本文授权给www.linuxaid.com.cn)5、如不遵守本规定,则无权转载本文。作者...

javahigh1 300

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。Google登录界面也会出现如下提示这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这个提示,但本质的问题没有解决,无法登录Google账号。

胡同老道的博客 2万+

【计算机组成原理】实验4:单周期CPU(Verilog)中海大

【计算机组成原理】实验4:单周期CPU

m0_63023532的博客 3660

C++项目性能优化与问题排查:从内存泄漏到死锁的实战工具链解析

在C++开发中,性能优化和问题排查是提升软件质量与稳定性的核心环节。其原理在于通过静态与动态分析工具,深入理解程序在编译时和运行时的行为,从而定位代码缺陷与性能瓶颈。这类技术的核心价值在于能显著提升软件可靠性、减少线上故障,并优化资源利用率。典型应用场景包括高并发服务的内存泄漏检测、多线程环境下的数据竞争分析,以及算法性能热点剖析。例如,使用AddressSanitizer(ASan)可以高效检测内存越界和使用后释放(Use-after-free)等内存错误,而ThreadSanitizer(TSan)则是

weixin_32642109的博客 248

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6574

【CPP】内存泄漏详解

内存泄漏通常会逐渐积累,导致程序占用过多的内存资源,最终可能引发程序崩溃、系统卡顿,甚至在长时间运行的系统中发生内存溢出。RAII(Resource Acquisition Is Initialization)是 C++ 中的一种资源管理模式,意味着资源(如内存、文件句柄、网络连接等)在对象的构造函数中分配,并且在析构函数中释放。如果在容器中存储指针类型数据而没有正确释放对象的内存,会导致内存泄漏。在 C++ 中,如果你为一个对象或数组动态分配了内存,但没有在适当的位置释放这些内存,就会导致内存泄漏。

Raizeroko的博客 1595

NVIDIA Jetson Orin系列 - 使用SDK Manager安装JetPack全流程解析

本文详细解析了使用NVIDIA官方SDK Manager为Jetson Orin系列开发板安装JetPack系统的完整流程。从环境准备、设备进入恢复模式,到SDK Manager图形化界面的分步操作指南,提供了新手友好的全流程解析,并分享了安装后的验证方法及常见问题解决方案,帮助开发者高效搭建稳定的边缘AI开发环境。

nn3456的博客 406

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢。

具身机器人和通用AI 1229

C++内存泄漏排查

linux c++内存泄漏排查方案汇总 参考:https://www.cnblogs.com/kex1n/p/11572313.html 使用mtrace分析内存泄漏 参考:https://zhuanlan.zhihu.com/p/83547768

lv_zj的专栏 6602

eDP V1.4协议介绍

eDP的全称是Embedded DisplayPort嵌入式显示端口,主要应用与短距离系统内应用,例如手机、一体式台式机等。eDP V1.4b是基于DP V1.3标准制作完成,但因应用场景的不同,还是有很多区别。电压摆幅不同,eDP相对较低;eDP功耗相对较低;DP有线材和连接器的要求,eDP没有明确要求;AUX通道电路设计不同(相对DP取消了AC耦合电容和100KΩ/1MΩ的上下拉电阻):典型应用场景;

qflook的博客 4303
上一篇: C++项目总结二之内存溢出
下一篇: C++项目总四之内存溢出造成的诡异函数调用
mxway
博客等级 码龄17年 370粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值