1、问题:
CDC *pDC=GetDC();
pDC->FillSolidRect();
this->ReleaseDC(pDC);  问:上面释放了DC,是否有必要加一句 pDC=NULL; 否则是否会产生野指针?
2、上面代码,如果改成如下,GetDC()->FillSolidRect();DC是否要释放?如何释放?GetDC()也是一个指针,它如何处理
3、关于指向控件的指针CWnd *pWnd=GetDlgItem(IDC_EDIT1);
pWnd->SetWindowText("");
这个指针用完,是否要赋值为NULL? 否则是否产生野指针?如果直接使用 GetDlgItem(IDC_EDIT1)->SetWindowText(""); 跟上面的代码有何区别? 
GetDlgItem(IDC_EDIT1)也是一个指针啊。用完如何处理?

解决方案 »

  1.   


    1、问题:
    CDC *pDC=GetDC();
    pDC->FillSolidRect();
    this->ReleaseDC(pDC);   问:上面释放了DC,是否有必要加一句 pDC=NULL; 否则是否会产生野指针?
    //没有必要,除非你在后面的代码还要用pDC,但是如果你后面还要用到pDC,ReleaseDC就不能写在这里了。
    2、上面代码,如果改成如下,GetDC()->FillSolidRect();DC是否要释放?如何释放?GetDC()也是一个指针,它如何处理
    //GetDC需要用ReleaseDC来释放,不应该这样使用GetDC。为了ReleaseDC,在GetDC时要把pDC指针保存着(同上1代码)3、关于指向控件的指针CWnd *pWnd=GetDlgItem(IDC_EDIT1);
    pWnd->SetWindowText("");
    这个指针用完,是否要赋值为NULL? 否则是否产生野指针?
    //没有必要,除非你要用pWnd的空与否来做一些判断。如果直接使用 GetDlgItem(IDC_EDIT1)->SetWindowText(""); 跟上面的代码有何区别?  
    GetDlgItem(IDC_EDIT1)也是一个指针啊。用完如何处理?
    //GetDlgItem得到窗口的指针,并没有分配内存(窗口的内存已经存在),这样用是可以的。
      

  2.   

    1 一般加上pDC=NULL的动机是:由于逻辑分支,pDC可能RelaseDC了,也可能没有。为保证释放资源,在清理过程中以pDC是否为空来判断是否需要ReleaseDC。这就要求pDC初始化为NULL,每次ReleaseDC之后改为NULL。
    2 MFC会生成临时的CDC对象,对应HDC。在CDC对象析构时,会判断是否要ReleaseDC。但这种风格不好。应该自己释放。
    3 HWND不需要释放。
      

  3.   

    非常感谢 ddszhan (高等数学) 的指教,让我受益良多。