我用BoundsCheck检查内存泄漏,它指出下面这句内存泄漏:
1、m_pRegDB = new CDatabase();   //Memory leak2、new CDynLinkLibrary(MouseHookDLL);
我看MSDN上也就是这样做的。怎么就内存泄漏了呢??

解决方案 »

  1.   

    在结束调用的地方你需要delete指针来释放内存,否则就造成内存泄漏if(m_pRegDB)
    {
       delete m_pRegDB;
       m_pRegDB = NULL;
    }
      

  2.   


    new和malloc申请的内存都是从堆上分配的,所以都需要释放所谓new出来不用释放的一般都是在哪些有垃圾收集机制的语言中,例如java就可以只管new而不用担心内存泄漏。
    C/C++中还是都需要手动释放的,也有一些特殊的数据结构可以做到自动释放,例如智能指针等,基本原理都是构造函数申请内存,析构函数释放内存不管怎么说delete和free语句还是要写的
      

  3.   

    BoundsCheck检查比较严格,第一个问题你要修改,第二个是MFC的逻辑,MFC程序结束后这个内存会被系统回收(和其他内存泄漏一样,但是只发生一次)
      

  4.   

    我在对话框关闭时释放内存了。
    void ASRegDlg::OnClose() 
    {
    // TODO: Add your message handler code here and/or call default
    if (m_pRegRst != NULL)
    {
    if (m_pRegRst->IsOpen())
    m_pRegRst->Close();
    delete m_pRegRst;
    m_pRegRst = NULL;
    }
    if (m_pRegDB != NULL)
    {
    m_pRegDB->Close();
    delete m_pRegDB;
    m_pRegDB = NULL;
    }
    CDialog::OnClose();
    }为什么还会这样呢??
      

  5.   

    断点断一下 看看走你的delete了吗?
    或你是否只new一次?
      

  6.   

    1。释放new出的东西。
    2。保证new出的东西内部没用leak.
    3。不要过于相信工具,包括BoundsCheck。
      

  7.   

    我在OnInitDialog中
    m_pRegDB = new CDatabase();
    m_pRegRst = new CRecordset(m_pRegDB);在OnClose()中释放。应该没问题呀!
      

  8.   

    to QunKangLi(维护成本与程序员的创造力的平方成正比) 
       我是程序出错后,才想到用这个试试。to wenkui(我心飞翔) 
       看看走你的delete了吗?或你是否只new一次?
    ------------------------
    1、   什么意思?它是在执行Open语句时抛错被Catch后执行了下面语句。
             catch (CDBException* pEx)
    {
    pEx->Delete();
    return;
    }
    你是说的这个吗?
    2、我只在OnInitDialog()中New了一次。
      

  9.   

    to  QunKangLi(维护成本与程序员的创造力的平方成正比) 
    1、释放new出的东西。
    2、保证new出的东西内部没用leak.
    --------------
    这两个不是一个意思吗?不懂。能多说两句吗?
      

  10.   

    to  lvgame(gameboy)
      好像没有了,但是其他的对话框中的释放操作都是放在OnClose()里,好好的。也没发生泄漏呀!
      为什么呢??
      

  11.   

    很奇怪!
    我在OnDestroy()中释放结果集,没有内存泄漏,但是程序本身的执行有问题。
    用BoundsCheck检查,发现它抛错。
      EXCEPTION(2nd Chance) Exception:  Access Violation
      code: C0000005  addr:023667E6
      ODBC32.dll-000067E6 (02360000)
      invalid read from DDDDDDDD
      EAX:02390000 EBX:02390000 ECX:DDDDDDDD
      EDX:0012F690 ESI:DDDDDDDD EDI:0012F718
      ESP:0012F664 EBP:0012F6A8 EIP:023667E6
      EFLAGS:00010286
      CS:001B DS:0023 ES:0023
      SS:0023 FS:003B GS:0000
      Stack dump
      00143C60:00000000:0C07BD90:DDDDDDDD
      Call stack
      ODBC32.dll!000067E6
      !0000A569
    是否表示对数据库的操作有问题?
    可能是什么错呢?
      

  12.   

    跟踪发现这句抛错:
    if (m_pGroupRst->IsOpen())    //抛错
    m_pGroupRst->Close();晕~~
      

  13.   

    用这个指针m_pGroupRst前 一定判是不是NULL
      

  14.   

    我有判断的:
    if (m_pGroupRst != NULL)
    {
    if (m_pGroupRst->IsOpen())
    m_pGroupRst->Close();
    delete m_pGroupRst;
    m_pGroupRst = NULL;
    }
      

  15.   

    抛的错是:
    “×××”指令应用了“0Xdddddddd”内存。该内存不能为“Read”。
      

  16.   

    2。保证new出的东西内部没有leak.有些类会在使用中new些东西出来,如下面这个类:
    class A {
    A() { m_p = new int ; }
    virtual ~A() { delete m_p ; }
    public:
    int *m_p ;
    } ;A *pA = new A ;
      

  17.   

    对了 你是个对话框?
    那在delete之前要调destroywindow();
      

  18.   

    另:程序运行时出的是什么错?像这种只new了一回的情况,即使不delete也对程序运行没得影响。
      

  19.   

    对了 你是对话框
    有其它windows资源 
    new 出来的在delete前要调destorywindow();