"armistad" <armis...@gmail.com> wrote in message
news:1ba3e894-fe33-4a11-8205-229ab15949e4@e10g2000prf.googlegroups.com...
I've written a small test app that places a CScrollView-derived class
into a CDialog. It's a simple app and it appears do to everything I
expect, until I select OK or CANCEL to terminate the dialog. At that
point the program aborts with a message of:
Warning: Creating a pane with no CDocument
HEAP[ScrollTest.exe]: Invalid Address specified to
RtlValidateHeap( 00350000, 0035AD1C )
The (I believe) pertinent lines of the stack trace are:
msvcr80d.dll!_CrtIsValidHeapPointer(const void *
pUserData=0x0035ad3c) Line 1963 C++
msvcr80d.dll!_free_dbg_nolock(void * pUserData=0x0035ad3c, int
nBlockUse=12582916) Line 1252 + 0x9 bytes C++
msvcr80d.dll!_free_dbg(void * pUserData=0x0035ad3c, int
nBlockUse=12582916) Line 1194 + 0xd bytes C++
mfc80ud.dll!CObject::operator delete(void * p=0x0035ad3c) Line 42 +
0xf bytes C++
ScrollTest.exe!CScrollWnd::`scalar deleting destructor'() + 0x3c
bytes C++
...
I'm new to MFC so there's a lot of fundamental things I haven't really
had a chance to learn yet. I wonder though, if this has to do with how
I am attaching my CScrollView-derived object onto the CDialog class:
BOOL CScrollDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// IDC_STATIC_AREA is a CStatic object
CWnd* pWnd = GetDlgItem(IDC_STATIC_AREA);
CRect rect;
pWnd->GetWindowRect(rect);
ScreenToClient(rect);
// m_scrollingView is an object of a class derived from
CScrollView
m_scrollingView.Attach(this, rect);
return TRUE;
}
Since the problem seems to manifest in the deletion of the
CScrollingView object, I expect that I'm not creating it properly. I
would appreciate any help.
CScrollView (and all other CView's) are designed to be constructed
dynamically, and they self delete when the window is destroyed. So you have
a member m_scrollingView that was not created with 'new' but is calling
'delete.' Solution: use 'new'
--
Scott McPhillips [VC++ MVP]