我也查了坛子里面的资料
一般认为是此FindWindow()函数非彼FindWindow()函数,CWin::FindWindow包装了Windwos API中的同名函数。我也同意这种说法,但是如果CWin::FindWindow返回的CWnd对象指针所指向的对象是由该函数自己产生的,那么应该是new出来的,而不是指向一个局部变量,我们一般在使用之后不会对该CWnd*指向的内存进行delete,那么自然有内存泄露,但是我测试了下,并没有内存泄露发生。
如此一来,1、推翻返回的对象指针指向的对象是new出来的,2、是MFC中有自行管理new出来的这个对象的机制,好像深入浅出MFC中没有提到,其他的MFC的书籍也没有提到,3、返回的对象指针所指向的对象是一种我们所不知道的东东。
一般认为是此FindWindow()函数非彼FindWindow()函数,CWin::FindWindow包装了Windwos API中的同名函数。我也同意这种说法,但是如果CWin::FindWindow返回的CWnd对象指针所指向的对象是由该函数自己产生的,那么应该是new出来的,而不是指向一个局部变量,我们一般在使用之后不会对该CWnd*指向的内存进行delete,那么自然有内存泄露,但是我测试了下,并没有内存泄露发生。
如此一来,1、推翻返回的对象指针指向的对象是new出来的,2、是MFC中有自行管理new出来的这个对象的机制,好像深入浅出MFC中没有提到,其他的MFC的书籍也没有提到,3、返回的对象指针所指向的对象是一种我们所不知道的东东。
{ return CWnd::FromHandle(::FindWindow(lpszClassName, lpszWindowName)); }
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.
.......a temporary CWnd object is created and attached
一个临时的CWnd对象被创建,那么他什么时候会被销毁呢?
如果要等到程序结束,那么也太可怕拉
{
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);
如果不存在映射就可以创建了.
MSDN上有这样一句话
This temporary object is valid only until the next time the application has idle time in its event loop
所以它会在下一个idle time 中被销毁!