Article ID: 839859
Article Last Modified on 8/18/2005
APPLIES TO
- Microsoft Windows CE Platform Builder 2.11
- Microsoft Windows CE Platform Builder 2.12
- Microsoft Encarta Reference Suite 2001
- Microsoft Windows CE Platform Builder 4.0
- Microsoft Windows CE Platform Builder 4.1
- Microsoft Windows CE Platform Builder 4.2
SYMPTOMS
Temporary Microsoft Foundation Class (MFC) objects may not be deleted in Microsoft Windows CE Platform Builder. MFC applications may leak memory. A Windows CE Platform Builder application that uses the MFC object may consume an increasing amount of memory as window objects are used.
CAUSE
MFC creates a temporary mapping of a Win32 system object handle to an MFC object when a Win32 system object handle is used in an MFC application. The temporary mapping is performed for the following Win32 system object handles:
- Window handles, such as dialog boxes
- Image lists
- Graphics device interface (GDI) objects
- Menus
- Device contexts (DCs)
Note Windows CE Platform Builder does not implement the type of idle processing that Microsoft Desktop Windows MFC uses. Desktop Windows MFC uses idle processing time to clean up the memory that is used by these temporary objects. Windows CE Platform Builder does not do this. Therefore, the temporary objects are never deleted until the application exits.
WORKAROUND
To work around this problem, each MFC application must contain a call to the CWinApp::OnIdle() method. You can use the following code example to do this.
AfxGetApp()->CWinApp::OnIdle(1);
This call must be at a location in the program flow that is reached at set intervals. However, the location in the program flow must be where none of the affected temporary objects are in scope or are instantiated. For example, temporary objects are not in scope and are not instantiated when the following conditions are true:
- When you select a main menu item
- After a dialog box is closed
The CWinApp::OnIdle() method deletes the temporary mapping for all base classes. Temporary objects of a specific base class may be deleted by calling the DeleteTempMap method of the object. You can use the following code example to do this.
CDC::DeleteTempMap();
Warning Do not delete the temporary map while the object is still in scope or is still instantiated. This may cause a different memory leak to occur.
REFERENCES
For additional information about MFC idle processing and about cleanup of temporary objects, click the following article number to view the article in the Microsoft Knowledge Base:
105286 How to clean up temporary MFC objects in _USRDLL DLLs
To review the source code for Windows CE Platform Builder MFC, visit the following location:
Others\MFC\SRC folder for Windows CE Platform Builder 3.0, for Microsoft Windows CE .NET 4.0, for Windows CE .NET 4.1, and for Windows CE .NET 4.2.
Keywords: kbtshoot kbprb KB839859