FIX: DYNAMIC_DOWNCAST & STATIC_DOWNCAST Causes Stack Overflow (151070)
The information in this article applies to:
- The Microsoft Foundation Classes (MFC), when used with:
- Microsoft Visual C++, 32-bit Editions 4.1
This article was previously published under Q151070 SYMPTOMS
When the DYNAMIC_DOWNCAST and STATIC_DOWNCAST macros are called, and
a pointer to a "const" object is passed, you see an error message
similar to the following in debug mode:
Unhandled exception in downcast.exe (MFC40D.DLL); Stack Overflow.
In release builds, the application hangs.
CAUSE
The DYNAMIC_DOWNCAST and STATIC_DOWNCAST macros invoke the
AfxDynamicDownCast and AfxStaticDownCast functions respectively. A code
defect in Visual C++ version 4.1 causes these calls to be recursive if the
object pointer passed as the second parameter to either macro points to a
"const" object. The end result is a stack overflow.
RESOLUTION
To work around this problem, remove the "const" attribute for the object
pointer in the call to the appropriate DOWNCAST macro. You can do this by
using the "const_cast" operator as follows:
//CMyDlg is derived from CDialog
const CMyDlg dlg;
//pdlg is a pointer to a const object
const CMyDlg* pdlg = &dlg;
DYNAMIC_DOWNCAST(CDialog, const_cast<CMyDlg*>(pdlg));
// or
STATIC_DOWNCAST(CDialog, const_cast<CMyDlg*>(pdlg));
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products
listed at the beginning of this article. This bug was corrected in Visual
C++ 32-bit Edition version 4.2.
Modification Type: | Major | Last Reviewed: | 10/24/2003 |
---|
Keywords: | kbBug kbfix kbNoUpdate kbVC420fix KB151070 |
---|
|