我也查了坛子里面的资料
一般认为是此FindWindow()函数非彼FindWindow()函数,CWin::FindWindow包装了Windwos API中的同名函数。我也同意这种说法,但是如果CWin::FindWindow返回的CWnd对象指针所指向的对象是由该函数自己产生的,那么应该是new出来的,而不是指向一个局部变量,我们一般在使用之后不会对该CWnd*指向的内存进行delete,那么自然有内存泄露,但是我测试了下,并没有内存泄露发生。
如此一来,1、推翻返回的对象指针指向的对象是new出来的,2、是MFC中有自行管理new出来的这个对象的机制,好像深入浅出MFC中没有提到,其他的MFC的书籍也没有提到,3、返回的对象指针所指向的对象是一种我们所不知道的东东。

解决方案 »

  1.   

    MFC每个类内都有一个隐藏的指针this,FindWindow()返回的就是这个指针
      

  2.   

    _AFXWIN_INLINE CWnd* PASCAL CWnd::FindWindow(LPCTSTR lpszClassName, LPCTSTR lpszWindowName)
    { return CWnd::FromHandle(::FindWindow(lpszClassName, lpszWindowName)); }
      

  3.   

    1楼说的不对,mfc的程序是这样,别的呢?
      

  4.   

    CWnd::FromHandle
     Returns a pointer to a CWnd object when given a handle to a window. If a CWnd object is not attached to the handle, a temporary CWnd object is created and attached.
      

  5.   

    to akirya(坏[其实偶不是什么所谓的坏人]) ( ) 
    .......a temporary CWnd object is created and attached
    一个临时的CWnd对象被创建,那么他什么时候会被销毁呢?
    如果要等到程序结束,那么也太可怕拉
      

  6.   

    CWnd* PASCAL CWnd::FromHandle(HWND hWnd)
    {
    CHandleMap* pMap = afxMapHWND(TRUE); //create map if not exist
    ASSERT(pMap != NULL);
    CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);#ifndef _AFX_NO_OCC_SUPPORT
    pWnd->AttachControlSite(pMap);
    #endif ASSERT(pWnd == NULL || pWnd->m_hWnd == hWnd);
    return pWnd;
    }所以应该是系统维护的.应该是系统在退出时再销毁.关键是这句
    CWnd* pWnd = (CWnd*)pMap->FromHandle(hWnd);
    如果不存在映射就可以创建了.
      

  7.   

    临时的对象不会等到程序结束被销毁!
    MSDN上有这样一句话
    This temporary object is valid only until the next time the application has idle time in its event loop
    所以它会在下一个idle time 中被销毁!