none
heap释放有点问题 RRS feed

  • 常规讨论

  • 我用扩展dll展出非模态对话框,用的方法是:

    .h文件

    #include "House.h"

    #pragma comment(lib, "No5.lib")

     

    CHouse *pHouse;

    在.cpp文件中

    构造函数中:

    pHouse = new CHouse;

    析构函数中:

    if(pHouse)
    delete pHouse;

    我用的是静态加载dll,在程序退出的时候提示一个错误,大概意思是堆释放出错.


    xiao
    2011年4月21日 1:30

全部回复

  • 您确定是delete操作的问题吗?delete是否重复操作了呢?一般都是delete以后,将指针置为NULL。否则很容易造成悬垂指针,即野指针。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年4月21日 2:50
    版主
  • delete pHouse;操作有点问题

    断点在__crtExitProcess

    以前用delete没有错误,这次有,怀疑是delete 操场作不能释放大镜heap,或是出现不明错误


    xiao
    2011年4月21日 6:09
  • if(pHouse)
    delete pHouse;

    pHouse = NULL;


    麻烦把正确答案设为解答。
    2011年4月22日 10:26
    版主
  • 试过的,不行
    xiao
    2011年4月22日 13:30
  • 是不是在你释放之前就已经销毁了?

    或者再给点示范的代码参考一下

    2011年4月26日 8:55
  • 确定把delete pHouse;这句去掉就没有问题吗?
    麻烦把正确答案设为解答。
    2011年4月26日 14:58
    版主
  • 去掉delete pHouse没有报错,能正常运行
    xiao
    2011年4月27日 5:30
  • CHouse的西构做什么了?
    麻烦把正确答案设为解答。
    2011年4月27日 6:27
    版主
  • 全部代码如下:

    CHouse::CHouse(CWnd* pParent /*=NULL*/)
     : CDialogEx(CHouse::IDD, pParent)
    {

    }

    CHouse::~CHouse()
    {
    }

    ------------------------------

    构造/析构

    CManagerDlg::CManagerDlg(CWnd* pParent /*=NULL*/)
     : CDialogEx(CManagerDlg::IDD, pParent)
    {
     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
     IsLogin = false;

     pPage1 = new CPage1;
     pPage2 = new CPage2;
     pPage3 = new CPage3;
     pHouse = new CHouse;
     pBack  = new CBack;
    }

    CManagerDlg::~CManagerDlg()
    {
     if(pPage1)
      delete pPage1;
    // pPage1 = NULL;

     if(pPage2)
      delete pPage2;

     if(pPage3)
      delete pPage3;

     if(pHouse)
      delete pHouse;

     if(pBack)
      delete pBack;
    }

    ----------------------------------------------

    创建对话框

    void CManagerDlg::CreatePage(void)
    {
     pPage1->Create(IDD_PAGE1, this);
     pPage2->Create(IDD_PAGE2, this);
     pPage3->Create(IDD_PAGE3, this);

     pHouse->Create(IDD_HOUSE, GetDesktopWindow());
     pBack->Create(IDD_BACK, GetDesktopWindow());

     move();
    }

    -----------------------------

    移运到相应位置

    void CManagerDlg::move(void)
    {
    // CRect rect;
    // GetDlgItem(IDC_STA2)->GetWindowRect(rect);

    // ScreenToClient(rect);
     pPage1->MoveWindow(rect);
     pPage2->MoveWindow(rect);
     pPage3->MoveWindow(rect);
    }

    ----------------------------------

    显示

    void CManagerDlg::ActivePage(int page)
    {
     switch(page)
     {
     case 0:
      pPage1->ShowWindow(SW_SHOW);
      pPage2->ShowWindow(SW_HIDE);
      pPage3->ShowWindow(SW_HIDE);
      break;
     case 1:
      pPage1->ShowWindow(SW_HIDE);
      pPage2->ShowWindow(SW_SHOW);
      pPage3->ShowWindow(SW_HIDE);
      break;
     case 2:
      pPage1->ShowWindow(SW_HIDE);
      pPage2->ShowWindow(SW_HIDE);
      pPage3->ShowWindow(SW_SHOW);
      break;
     default:
      ;
     }
    }


    xiao
    2011年4月28日 6:14