对象的销毁步骤
1.首先看对象的包含关系。
CWinApp::m_pDocManager对象中有成员m_templateList,存储的是docTemplate.
每一个MultiDocTemplate中有成员 m_docList,存储的是所有的doc对象。
每一个Document里面有成员m_viewList,里面存储的是这个doc对应的所有view。
每一个view都有一个 parentFrame,这个parentFrame就是 MDIChildFrame。
2.下面来看是怎样来销毁对象的
1.首先看对象的包含关系。
CWinApp::m_pDocManager对象中有成员m_templateList,存储的是docTemplate.
每一个MultiDocTemplate中有成员 m_docList,存储的是所有的doc对象。
每一个Document里面有成员m_viewList,里面存储的是这个doc对应的所有view。
每一个view都有一个 parentFrame,这个parentFrame就是 MDIChildFrame。
2.下面来看是怎样来销毁对象的
这里已经看到对 doc 对象的delete了,就是在图片的最后一句。那么对view和 MDIChildFrame的 delete语句又在什么地方呢?
接着看DestroyWindow()的代码
BOOL CMDIChildWnd::DestroyWindow()
{
...
MDIDestroy();
...
最关键的一句是MDIDestroy(); ,它的代码如下,作用就是发送了一个消息。
void CMDIChildWnd::MDIDestroy()
{ ASSERT(::IsWindow(m_hWnd)); ::SendMessage(GetParent()->m_hWnd, WM_MDIDESTROY, (WPARAM)m_hWnd, 0L); }
这个发送消息的代码我们看不到源代码,只能看到一些汇编代码。
但是我们只需要记着: 这个发送消息的函数会先 delete view,然后会在这个childFrame没有任何view之后再 delete frame。只需要知道他们delete的先后顺序,然后稍微跟踪下代码,一切都好办了。