Microsoft KB Archive/88557

= INFO: CFrameWnd Objects Can Destroy Themselves =

Article ID: 88557

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft C/C++ Professional Development System 7.0

 Microsoft Visual C++ 6.1

 Microsoft Visual C++ 6.0 Professional Edition

 Microsoft Visual C++ 6.0 Enterprise Edition</li></ul>

 Microsoft Visual C++ 5.0 Learning Edition</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q88557

<div class="notice_section">

7.00 | 1.00 1.50 1.51 1.52 | 1.00 2.00 2.10 4.00 MS-DOS | WINDOWS | WINDOWS NT kbprg

<div class="summary_section">

SUMMARY
Objects derived from the CFrameWnd class destroy themselves automatically when the Window that is associated with the object processes the WM_NCDESTROY message. Because objects derived from CFrameWnd classes destroy themselves, it is recommended that applications use the &quot;new&quot; operator to create new instances of this class on the heap.

<div class="moreinformation_section">

MORE INFORMATION
Objects derived from CFrameWnd are designed to &quot;clean up&quot; after themselves. The CFrameWnd class overloads the OnNcDestroy member function that makes a call to the PostNcDestroy member function, which in turn does a &quot;delete this.&quot;

CMDIFrameWnd and CMDIChildWnd, which are derived from CFrameWnd, exhibit identical behavior.

The OnNcDestroy function is called when the window receives the WM_NCDESTROY message. This is the last message a window receives. As a result, CFrameWnd objects should be created on the heap using the &quot;new&quot; operator, and should never be explicitly deleted by the application. If the application needs to destroy the object, it should use the DestroyWindow member function, which destroys both the window and its CFrameWnd object.

In general, CFrameWnd objects should not be used as local variables in functions or as embedded objects in other classes. Doing so may cause the object's destructor to be called twice: once when the user closes the window, and once when the function containing the local variable goes out of scope or when the object containing the embedded CFrameWnd object is deleted. Attempting to delete the object more than once may cause an unrecoverable application error (UAE).

You can create a CFrameWnd-derived object on the stack or as a static object if the application overrides the PostNcDestroy function for the derived class. PostNcDestroy is a virtual member function of the CWnd class that is called by the OnNcDestroy function. The overridden PostNcDestroy function for the derived class should do nothing, rather than &quot;delete this.&quot; This prevents the object from being destroyed twice.

Additional query words: kbinf 7.00 1.00 1.50 2.00 2.10 2.50 2.51 2.52 3.00 3.10 4.00

Keywords: kbarchitecture kbdocview kbinfo kbuidesign KB88557

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.