• 今天我内存泄漏了......C++ 中的虚析构函数以及内存泄漏的调试方法


    我终于内存泄漏一次了,我觉得这是一个开始。

    这个项目的内存泄漏有两处:

      1.窗体销毁时,忘记delete apiCtrl类的指针

      2.IScanBase基类忘记用虚析构函数,偷懒3秒,3小时调试到死。

      为什么要用虚析构函数:

        1.虚函数:多态时,编译器查找虚函数表,找到最高子类该函数调用。

        2.析构函数:析构子类  后 析构父类

        3.多态时:  base b = new child();  d->f(虚函数);   delete b;  

            此时问题出现了,我们new 的时候准确知道调用child构造,调用f()也知道f为虚函数,

            但是delete呢,如果基类的析构非需,则只能调用基类析构,将会导致子类析构没做,造成内存泄漏。

            所以我们有这样的准则:

              基类中有虚函数,那就必须为基类声明虚析构函数。 (你玩多态,必然有基类指针指向new 的子类,子类想正确被释放,则基类必须虚析构函数)

              一个类若不做基类,或者不具备多态性质,则没有必要声明虚析构函数。

    内存泄漏调试方法:

      VS下:

      debug走起,还原内存泄漏情况,关闭调试,输出泄漏信息,大致如下:Detected memory leaks!

    Dumping objects ->
    {98500} normal block at 0x05785AD0, 152 bytes long.
    Data: << N       N x 7 > 3C AC 4E 10 00 00 00 00 BC A4 4E 10 78 B6 37 00
    Object dump complete.

    {98500}表示个在这个地方分配内存出错了,

    _CrtSetBreakAlloc(98500); //98500为上面内存泄漏的块号.

    上面这句话扔到程序开始运行处,(泄漏之前也可以),debug下自动断在哪里,然后去哪里分配了内存却没有释放吧。

    //检测内存泄漏
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>

    IdScanXFS::IdScanXFS()
    {
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    m_IdenBase = NULL;
    m_bIsFindDevtype = true;
    m_strLogPath = "";
    }

  • 相关阅读:
    MFC中 CListCtrl控件的使用及定位、选中
    在VC++6.0中,编译,调试都能通过,但运行到某一步的时候就报错的可能原因。
    存储IplImage结构体到STL中的vector中的问题
    VS工程,换电脑后出现的问题
    What is a Full Stack developer?
    [MB855]变砖解决
    ERP 开发过程中涉及到的算法 库存,工程,生产计划,固定资产计算方法
    定义枚举类型带有byte 的作用
    构造函数带有this和base的作用
    创建一个简单的WCF程序(转载)
  • 原文地址:https://www.cnblogs.com/jushuai/p/6589153.html
Copyright © 2020-2023  润新知