📄 subject_24072.htm
字号:
<p>
序号:24072 发表者:编程吧 发表日期:2002-12-09 13:54:43
<br>主题:关于深入浅出MFC中的一个问题
<br>内容:在第13章中那个Text范例程序中<BR>在InitInstance中除了缺省的那个CMultiDocTemplate* pDocTemplate;<BR>又创建了一个CMultiDocTemplate* m_pTemplateHex(不过是作为CTextApp的一个成员变量定义的)<BR>如下:<BR> m_pTemplateHex = new CMultiDocTemplate(<BR> IDR_TEXTTYPE,<BR> RUNTIME_CLASS(CTextDoc),<BR> RUNTIME_CLASS(CChildFrame), // custom MDI child frame<BR> RUNTIME_CLASS(CHexView));<BR> AddDocTemplate(m_pTemplateHex);<BR><BR>然后在ExitInstance中,如下:<BR>int CTextApp::ExitInstance() <BR>{<BR> delete m_pTemplateHex;<BR> // 如果加上这一句,关闭程序时会出错,去掉这一句就没事<BR> // 但如果去掉这一句,m_pTemplateHex到底释放了没有呢?<BR><BR> return CWinApp::ExitInstance();<BR>}<BR><BR>我跟踪了一下,错误是在CWinApp::SaveStdProfileSettings()中抛出的<BR>int CWinApp::ExitInstance()<BR>{<BR> // if we remember that we're unregistering,<BR> // don't save our profile settings<BR><BR> if (m_pCmdInfo == NULL ||<BR> m_pCmdInfo->m_nShellCommand != CCommandLineInfo::AppUnregister)<BR> {<BR> if (!afxContextIsDLL)<BR> SaveStdProfileSettings();<BR> ~~~~~~~~~~~~~~~~~~~~~~~~<BR> ...<BR>}<BR><BR>void CWinApp::SaveStdProfileSettings()<BR>{<BR> ASSERT_VALID(this);<BR> // 就是这里出错,不明白?<BR> ...<BR>}<BR><BR><BR>看了一下MFC源代码,觉得m_pTemplateHex应该是在下面的时候释放的。<BR>感觉即使不delete m_pTemplateHex,好像也因该会释放,但不明白上面为什么会出错?<BR>CDocManager::~CDocManager()<BR>{<BR> // for cleanup - delete all document templates<BR> POSITION pos = m_templateList.GetHeadPosition();<BR> while (pos != NULL)<BR> {<BR> POSITION posTemplate = pos;<BR> CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);<BR> if (pTemplate->m_bAutoDelete)<BR> {<BR> m_templateList.RemoveAt(posTemplate);<BR> delete (CDocTemplate*)pTemplate;<BR> }<BR> }<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:tjhe 回复日期:2002-12-09 20:16:14
<br>内容:文档模板是CDocManager自动删除。如果在应用类中删除,应用类的CDocManager将会有无效的(已被删除的)文档模板。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:编程吧 回复日期:2002-12-09 21:08:26
<br>内容:但是程序是在还没运行到CDocManager的析构函数~CDocManager()是出错的<BR>不知为什么<BR>(出错的位置在上面标明了)<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:tjhe 回复日期:2002-12-10 10:19:09
<br>内容:应该是<BR>void CWinApp::SaveStdProfileSettings()<BR>{<BR> ASSERT_VALID(this);<BR> ...<BR>}<BR>中的ASSERT_VALID(this);要判断应用类的所有文档模板的合法性(通过CDocManager)<BR>2002-12-10 10:20:01
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -