1、在视图类的消息响应函数里new了一个CFont。
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
.......
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont);
.....
}2、在视图类的析构函数或是重写DestroyWindow函数里delete m_pfont。3、但程序退出时总是报内存泄露。这是为什么?4、只能改为如下方式实现吗:
void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
{
m_pFont = new CFont;
m_pFont->CreateFontIndirect(&logft);
editCtrl.SetFont(m_pFont); m_pFont->Detach();
delete m_pFont;
m_pFont = NULL;
}5、请高手指点一下。谢谢。

解决方案 »

  1.   

    光delete font是不行的,还得font.DeleteObject
      

  2.   

    问题不在这里,如下还是报内存泄露
    BOOL CMyPropertySheetView::DestroyWindow() 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (m_pFont)
    {
    m_pFont->DeleteObject();
      delete m_pFont;
      m_pFont = NULL;
    } return CEditView::DestroyWindow();
    }使用上文中的方式4,不会有内存泄露问题。怀疑还是时机不对。
      

  3.   

    m_pFont->DeleteObject();
    delete m_pFont;
    可以同时用??不解
      

  4.   

    m_pFont = new CFont;
    m_pFont->CreateFontIndirect(&logft);
    这么创建觉得也不可理解啊~
    直接create出来就行了
      

  5.   

    不好意思没看贴只看了回复~~
    你第一种方法明显不行
    你在消息里面new,如果多个消息发送,而只在析构函数里面delete~~这样是不行的~肯定有内存泄漏
    你可以判断下m_pFont != NULL就不要在create和new了~
      

  6.   

    明显是你是多次执行了ONAPPLY这个函数,导致重复分配内存,你可以判断下m_pFont != NULL就不要在create和new了。还有析构的时候,deleteobject就必须的。
      

  7.   

    改成这样:
    void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
    {
    .......
    if(m_pFont!=NULL)
    {
     m_pFont->DeleteObject();
     m_pFont=NULL;
    }
    m_pFont = new CFont;
    m_pFont->CreateFontIndirect(&logft);
    editCtrl.SetFont(m_pFont);
    .....
    }
    然后在析构函数中同样调用DeleteObject()释放。
      

  8.   

    改成这样:
    void CMyPropertySheetView::OnApply(WPARAM wParam, LPARAM lParam)
    {
    .......
    if(m_pFont!=NULL)
    {
    delete m_pFont;就可以了,析构会自动调用deleteobject的
    }
    m_pFont = new CFont;
    m_pFont->CreateFontIndirect(&logft);
    editCtrl.SetFont(m_pFont);
    .....
    }然后在ondestroy里面再delete m_pFont; m_pFont = NULL;
      

  9.   

    问题出现在m_pFont->Detach();
    这句执行后m_pFont拥有的handle放弃了控制权,也就说m_pFont中handle指向的内存区没有释放。
    修改方法,去掉:m_pFont->Detach();
      

  10.   

    直接授予渔吧
    http://blog.csdn.net/HeavenMonkey/archive/2008/05/24/2476411.aspx
      

  11.   

    你没点Apply,还没分配内存,你delete肯定出错了!你要在初始化中令m_pFont = NULL;
      

  12.   

    综合上述的就可以了,new之前先判断一下是否为NULL,当然初始的时候设置为NULL
      

  13.   

    主要是 DestroyWindow 没有被在该调用的时候被调用到
    你应该放在OnClose中
      

  14.   

      析构函数从窗口的创建到销毁只会执行一次  所以只会delete一次   而如果你的消息处理函数总共被调用N次的话   也nwe了N次   退出程序时还有N-1次new的没有被释放..
      这种情况时
           1.你必须确保new所在的函数在窗口类对象生命期内只会调用一次
           2.如上面朋友所说 在执行new的时候先判断是否为NULL, 也就是确保只new一次
      

  15.   

    OnApply消息响应函数的确只调用了一次。在OnApply函数中我也加入了
    if (m_pFont)
    {
    m_pFont->DeleteObject();
      delete m_pFont;
      m_pFont = NULL;
    }
    这样的语句,还是抱内存泄露,问题没有解决啊。
      

  16.   

    你没有SELECTOBJECT(oldobject)把你所创建的FONT弄出来,deleteoject是无效的,因为还被你的程序用着。不信你可以用临时变量font看看。font生存期完了(学过c plus plus都明白,什么DETACH它都帮你调)程序照样能运行,说明font还在内存中呢。
      

  17.   

    光delete font是不行的,还得font.DeleteObject
    不是很明白,具体的道理是怎么样的?
      

  18.   

    不用调用font.DeleteObject的,只有多个字体切换时才需要调用。调试了一下代码,发现DestroyWindow函数没有被调用到,将释放代码
    放到析构函数就可以了。为什么DestroyWindow函数在程序退出时没有调用呢?