⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_24072.htm

📁 一些关于vc的问答
💻 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>&nbsp;&nbsp;&nbsp;&nbsp;m_pTemplateHex = new CMultiDocTemplate(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDR_TEXTTYPE,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME_CLASS(CTextDoc),<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME_CLASS(CChildFrame), // custom MDI child frame<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RUNTIME_CLASS(CHexView));<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddDocTemplate(m_pTemplateHex);<BR><BR>然后在ExitInstance中,如下:<BR>int CTextApp::ExitInstance() <BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;delete m_pTemplateHex;<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 如果加上这一句,关闭程序时会出错,去掉这一句就没事<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 但如果去掉这一句,m_pTemplateHex到底释放了没有呢?<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return CWinApp::ExitInstance();<BR>}<BR><BR>我跟踪了一下,错误是在CWinApp::SaveStdProfileSettings()中抛出的<BR>int CWinApp::ExitInstance()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// if we remember that we're unregistering,<BR>&nbsp;&nbsp;&nbsp;&nbsp;// don't save our profile settings<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (m_pCmdInfo == NULL ||<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pCmdInfo-&gt;m_nShellCommand != CCommandLineInfo::AppUnregister)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!afxContextIsDLL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SaveStdProfileSettings();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<BR>}<BR><BR>void CWinApp::SaveStdProfileSettings()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT_VALID(this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;// 就是这里出错,不明白?<BR>&nbsp;&nbsp;&nbsp;&nbsp;...<BR>}<BR><BR><BR>看了一下MFC源代码,觉得m_pTemplateHex应该是在下面的时候释放的。<BR>感觉即使不delete m_pTemplateHex,好像也因该会释放,但不明白上面为什么会出错?<BR>CDocManager::~CDocManager()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;// for cleanup - delete all document templates<BR>&nbsp;&nbsp;&nbsp;&nbsp;POSITION pos = m_templateList.GetHeadPosition();<BR>&nbsp;&nbsp;&nbsp;&nbsp;while (pos != NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POSITION posTemplate = pos;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetNext(pos);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pTemplate-&gt;m_bAutoDelete)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_templateList.RemoveAt(posTemplate);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete (CDocTemplate*)pTemplate;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<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>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT_VALID(this);<BR>&nbsp;&nbsp;&nbsp;&nbsp;...<BR>}<BR>中的ASSERT_VALID(this);要判断应用类的所有文档模板的合法性(通过CDocManager)<BR>2002-12-10 10:20:01

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -