📄 subject_57430.htm
字号:
<p>
序号:57430 发表者:金沐灶 发表日期:2003-10-25 12:03:56
<br>主题:一个问题,有点奇怪。上个问题发错了,上好意思。
<br>内容:在类CDialog中,定义了成员变量:……BOOL m_bLiaoSend;CMydo m_do;……,但是退出时出错,是m_do内存释放出错,但是我把他写成:……CMydo m_do;BOOL m_bLiaoSend;……,完全正确,我记得好像有内存对齐的说法,是不是就是这种情况,如何确保不发生类似情况。先谢啦。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:金沐灶 回复日期:2003-10-25 12:07:08
<br>内容:又发错了,第一句是在类CMyDialog中。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:lijb 回复日期:2003-10-25 14:12:10
<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>
回复者:金沐灶 回复日期:2003-10-25 18:48:54
<br>内容:这是正确的<BR>// RealcomDlg.h : 头文件<BR>//<BR><BR>#pragma once<BR>#include "spClientEvents.h"<BR>#include "Mydo.h"<BR>// CRealcomDlg 对话框<BR>class CRealcomDlg : public CDialog<BR>{<BR>// 构造<BR>public:<BR> CRealcomDlg(CWnd* pParent = NULL); // 标准构造函数<BR> //界面<BR> CDialog m_dlgGet;CDialog m_dlgStatus;CDialog m_dlgSend;<BR> CTabCtrl * m_ptcShow;int m_nTest;<BR> CListCtrl * m_plcStatus;CListCtrl * m_plcGet;CListCtrl * m_plcSend;<BR> //设置数据<BR> CString m_strDataIP;<BR> CString m_strDataName;<BR> CString m_strDataUID;<BR> CString m_strDataPWD;<BR> CString m_strUNIP;<BR> CString m_strUNPort;<BR> CString m_strUNUID;<BR> CString m_strUNPWD;<BR> CString m_strMOIP;<BR> CString m_strMOPort;<BR> CString m_strMOUID;<BR> CString m_strMOPWD;<BR> //注册表项是否为空(决定程序是否初始化)<BR> BOOL m_bHavaInit;<BR> //状态栏<BR> NOTIFYICONDATA m_tnd;<BR> //时钟,数据库,服务器连接<BR> BOOL m_bTimer1,m_bTimer2;<BR> _ConnectionPtr m_pConn;<BR> BOOL m_bUNConn,m_bMOConn;<BR> IspClient * m_ispClientUN;<BR> IspClient * m_ispClientMO;<BR> CspClientEvents m_esUN;DWORD m_desUN;<BR> CspClientEvents m_esMO;DWORD m_desMO;<BR> CMydo m_do;BOOL m_bLiaoSend;<BR>// 对话框数据<BR> enum { IDD = IDD_REALCOM_DIALOG };<BR> protected:<BR> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持<BR><BR><BR>// 实现<BR>public:<BR> //公共的方法<BR> //处理客户事件响应<BR> void MyStatusDisp0(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp1(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp2(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp3(UINT uIsUN,unsigned long nStatus);<BR> void MyReceiveMsg(UINT uIsUN,CString source,CString destination,CString service,long msgfmt,CString cmd,long len,CString msg);<BR> void MySendResp(UINT uIsUN,unsigned long result,unsigned long seqid);<BR> //连接相关<BR>protected:<BR> BOOL MyConnUN();<BR> BOOL MyConnMO();<BR> BOOL MyConnData();<BR>public:<BR> BOOL MyConn();<BR> void MyDisConn();<BR> //数据处理<BR> void MySend();<BR> void MyGetBack(long lID);<BR> void MyGetBackStatus(long lID,long lStatus);<BR>protected:<BR> HICON m_hIcon;<BR> //受保护的方法<BR> virtual void MyReleaseAll();<BR> virtual BOOL DestroyWindow();<BR> // 生成的消息映射函数<BR> virtual BOOL OnInitDialog();<BR> afx_msg void OnPaint();<BR> afx_msg HCURSOR OnQueryDragIcon();<BR> DECLARE_MESSAGE_MAP()<BR>public:<BR> afx_msg void OnTcnSelchangeContent(NMHDR *pNMHDR, LRESULT *pResult);<BR> afx_msg void OnTcnSelchangingContent(NMHDR *pNMHDR, LRESULT *pResult);<BR> afx_msg void OnReConnect();<BR> afx_msg void OnDisConnect();<BR> afx_msg void OnSetup();<BR> afx_msg void OnExit();<BR> afx_msg void OnTimer(UINT_PTR);<BR> afx_msg LRESULT OnIconNotify(WPARAM, LPARAM);<BR> afx_msg void OnSysCommand( UINT, LONG );<BR> afx_msg void OnBnClickedCheck1();<BR> afx_msg void OnBnClickedMysend();<BR>};<BR><BR>这是错误的<BR>// RealcomDlg.h : 头文件<BR>//<BR><BR>#pragma once<BR>#include "spClientEvents.h"<BR>#include "Mydo.h"<BR>// CRealcomDlg 对话框<BR>class CRealcomDlg : public CDialog<BR>{<BR>// 构造<BR>public:<BR> CRealcomDlg(CWnd* pParent = NULL); // 标准构造函数<BR> //界面<BR> CDialog m_dlgGet;CDialog m_dlgStatus;CDialog m_dlgSend;<BR> CTabCtrl * m_ptcShow;int m_nTest;BOOL m_bLiaoSend;<BR> CListCtrl * m_plcStatus;CListCtrl * m_plcGet;CListCtrl * m_plcSend;<BR> //设置数据<BR> CString m_strDataIP;<BR> CString m_strDataName;<BR> CString m_strDataUID;<BR> CString m_strDataPWD;<BR> CString m_strUNIP;<BR> CString m_strUNPort;<BR> CString m_strUNUID;<BR> CString m_strUNPWD;<BR> CString m_strMOIP;<BR> CString m_strMOPort;<BR> CString m_strMOUID;<BR> CString m_strMOPWD;<BR> //注册表项是否为空(决定程序是否初始化)<BR> BOOL m_bHavaInit;<BR> //状态栏<BR> NOTIFYICONDATA m_tnd;<BR> //时钟,数据库,服务器连接<BR> BOOL m_bTimer1,m_bTimer2;<BR> _ConnectionPtr m_pConn;<BR> BOOL m_bUNConn,m_bMOConn;<BR> IspClient * m_ispClientUN;<BR> IspClient * m_ispClientMO;<BR> CspClientEvents m_esUN;DWORD m_desUN;<BR> CspClientEvents m_esMO;DWORD m_desMO;<BR> CMydo m_do;<BR>// 对话框数据<BR> enum { IDD = IDD_REALCOM_DIALOG };<BR> protected:<BR> virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持<BR><BR><BR>// 实现<BR>public:<BR> //公共的方法<BR> //处理客户事件响应<BR> void MyStatusDisp0(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp1(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp2(UINT uIsUN,unsigned long nStatus);<BR> void MyStatusDisp3(UINT uIsUN,unsigned long nStatus);<BR> void MyReceiveMsg(UINT uIsUN,CString source,CString destination,CString service,long msgfmt,CString cmd,long len,CString msg);<BR> void MySendResp(UINT uIsUN,unsigned long result,unsigned long seqid);<BR> //连接相关<BR>protected:<BR> BOOL MyConnUN();<BR> BOOL MyConnMO();<BR> BOOL MyConnData();<BR>public:<BR> BOOL MyConn();<BR> void MyDisConn();<BR> //数据处理<BR> void MySend();<BR> void MyGetBack(long lID);<BR> void MyGetBackStatus(long lID,long lStatus);<BR>protected:<BR> HICON m_hIcon;<BR> //受保护的方法<BR> virtual void MyReleaseAll();<BR> virtual BOOL DestroyWindow();<BR> // 生成的消息映射函数<BR> virtual BOOL OnInitDialog();<BR> afx_msg void OnPaint();<BR> afx_msg HCURSOR OnQueryDragIcon();<BR> DECLARE_MESSAGE_MAP()<BR>public:<BR> afx_msg void OnTcnSelchangeContent(NMHDR *pNMHDR, LRESULT *pResult);<BR> afx_msg void OnTcnSelchangingContent(NMHDR *pNMHDR, LRESULT *pResult);<BR> afx_msg void OnReConnect();<BR> afx_msg void OnDisConnect();<BR> afx_msg void OnSetup();<BR> afx_msg void OnExit();<BR> afx_msg void OnTimer(UINT_PTR);<BR> afx_msg LRESULT OnIconNotify(WPARAM, LPARAM);<BR> afx_msg void OnSysCommand( UINT, LONG );<BR> afx_msg void OnBnClickedCheck1();<BR> afx_msg void OnBnClickedMysend();<BR>};<BR><BR>注意:只是BOOL m_bLiaoSend;的位置不一样。其它地方完全一样。RealcomDlg.cpp没变。CMydo也没变。结果是后者m_do释放内存失败。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金沐灶 回复日期:2003-10-25 18:55:46
<br>内容:释放内存的代码是这样:(释放过程序没错,这个函数是正常运行的,错在这个函数退出后)<BR>void CRealcomDlg::MyReleaseAll()<BR>{<BR> //关闭<BR> Shell_NotifyIcon(NIM_DELETE,&m_tnd);<BR> if(!m_bHavaInit)<BR> return;<BR> m_do.MyRealeaseAll();<BR> MyDisConn();<BR> if(m_bTimer2)<BR> {<BR> KillTimer(2);<BR> m_bTimer2=FALSE;<BR> }<BR> //释放<BR> m_pConn.Release();<BR> HRESULT hr;<BR> IConnectionPointContainer *pCPC = NULL;<BR> IConnectionPoint *pCP = NULL;<BR> hr=m_ispClientUN->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPC);<BR> hr = pCPC->FindConnectionPoint(DIID_IspClientEvents, &pCP);<BR> pCPC->Release();pCPC=NULL;<BR> hr = pCP->Unadvise(m_desUN);<BR> pCP->Release();pCP=NULL;<BR> hr=m_ispClientMO->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPC);<BR> hr = pCPC->FindConnectionPoint(DIID_IspClientEvents, &pCP);<BR> pCPC->Release();pCPC=NULL;<BR> hr = pCP->Unadvise(m_desMO);<BR> pCP->Release();pCP=NULL;<BR> m_ispClientUN->Release();<BR> m_ispClientMO->Release();<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>
回复者:lijb 回复日期:2003-10-25 21:18:43
<br>内容:IConnectionPointContainer *pCPC = NULL;<BR> IConnectionPoint *pCP = NULL;<BR> hr=m_ispClientUN->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPC);<BR> hr = pCPC->FindConnectionPoint(DIID_IspClientEvents, &pCP);<BR>你建立COM对象,是不是要初始化一下,还有是不是要注意一下它的生命域。(不好意思,我的COM只学了一点)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金沐灶 回复日期:2003-10-25 21:58:04
<br>内容:不是这里的问题,这些地方是完全没问题的。初始化在另一个函数里。是m_do释放内存错,m_do。注意我的问题,同样的函数,同样的变量,但前者对,后者错。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金沐灶 回复日期:2003-10-26 13:41:45
<br>内容:出错的地方是m_do析构时,m_do里有一个CMapStringToPtr对象,这个对象析构出错,如果里面有元素,是DestructElement出错,我查帮助,这个方法什么也不做,看来它错了.如果没元素,也会出错,都是内存写错误.这个对象析构怎么会出错呢,奇怪.<BR>今天没上班,明天把m_do的初始化和释放代码给出来,大家一定帮帮忙哦.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金沐灶 回复日期:2003-10-26 20:35:25
<br>内容:CMydo是这样<BR>#pragma once<BR>class HnParamContent<BR>{<BR>public:<BR> HnParamContent(void)<BR> {<BR> }<BR> virtual ~HnParamContent(void)<BR> {<BR> }<BR> CString name;<BR> CStringArray value;<BR>};<BR><BR>class BackContent<BR>{<BR>public:<BR> BackContent(void)<BR> {<BR> }<BR> virtual ~BackContent(void)<BR> {<BR> }<BR> CString intro;<BR> CString format;<BR> CString content1;<BR> CString content2;<BR> CString content3;<BR>};<BR><BR>class CMydo<BR>{<BR>public:<BR> CMydo(void);<BR> virtual ~CMydo(void);<BR> //属性<BR> _ConnectionPtr m_pConn;<BR> long m_lHour;<BR> CMapStringToPtr m_mapParam;<BR> CMapStringToPtr m_mapBack;<BR> //方法<BR> void MyRealeaseAll();<BR> void MyGet();<BR> void MyInit();<BR> void MyOntime();<BR> void MySendUL(LPCTSTR strSource,LPCTSTR strDest,LPCTSTR strServiceid,CString strContent,long lFeetype,long lFeevalue,long lMFlag);<BR> void MySendUnion(LPCTSTR strSource,LPCTSTR strDestination,LPCTSTR strServiceid,LPCTSTR strContent,long lFeetype,long lFeevalue,long lMtflag);<BR>protected:<BR> void MyBackLiao(CString strUserID,CString strContent,CString strLiaoID);<BR> void MyLiaoEvent(CString strEvent,CString strUserID,CString strNiName,CString strLiaoID,CString strContent);<BR> void MyBackSay(CString strMobileCode,CString strSrcID,CString strDestMobileCode,CString strDestID,CString strCoTemp);<BR> void MyBuild(CString strMobileCode,CString strSrcID,long lSrcID,CString strDestMobileCode,CString strDestID,long lDestID);<BR> void MySay(CString strContent,BOOL bIsUnion,CString strMobileCode,CString strDest);<BR> void MyUpdateDate(CString strMobileCode);<BR> void MyUpdateSearch(CString strMobileCode,CString strSortCommand,long lPage);<BR> CString MySearch(CString strSelectCommand,CString strSortCommand,long & lPage);<BR> void MyReg(CString strContent,BOOL bIsUnion,CString strMobileCode,CString strDest);<BR> void MyUpdateReg(CString strContent,BOOL bIsUnion,CString strMobileCode,CString strDest);<BR> DWORD GetArrayFromString(CString strSrc,TCHAR cSplit,CStringArray * aDest);<BR> void GetMapFromString(CString strSrc,TCHAR cSplit,CMapStringToString * mapDest);<BR> void MyJFOnMonth(CString strCurDate,BOOL bIsUnion);<BR> BOOL MyDeleteCust(CString strCurDate);<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>
回复者:金沐灶 回复日期:2003-10-26 20:38:40
<br>内容:CMydo的初始化和释放代码是这样:<BR>void CMydo::MyInit()<BR>{<BR> m_pConn=((CRealcomDlg *)AfxGetMainWnd())->m_pConn;<BR> m_lHour=25;<BR> HnParamContent * m_pHPC;<BR> m_pHPC=(HnParamContent *)new HnParamContent();<BR> m_pHPC->name="性别";<BR> m_pHPC->value.Add("女");m_pHPC->value.Add("男");<BR> m_mapParam["B"]=m_pHPC;<BR> BackContent * pBC;<BR> long lState;<BR> m_pConn->get_State(&lState);<BR> if(lState!=adStateOpen)<BR> return;<BR> _variant_t varTemp;<BR> CString strTemp;<BR> _RecordsetPtr MySet2;<BR> MySet2.CreateInstance(__uuidof(Recordset));<BR> MySet2->Open("select * from 返回内容",m_pConn.GetInterfacePtr(),adOpenForwardOnly,adLockReadOnly,adCmdText);<BR> while(!MySet2->EndOfFile)<BR> {<BR> pBC=(BackContent *)new BackContent();<BR> varTemp=MySet2->GetCollect("标志");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> m_mapBack.SetAt(strTemp,pBC);<BR> }<BR> varTemp=MySet2->GetCollect("说明");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> pBC->intro=strTemp;<BR> }<BR> varTemp=MySet2->GetCollect("格式");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> pBC->format=strTemp;<BR> }<BR> varTemp=MySet2->GetCollect("内容一");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> pBC->content1=strTemp;<BR> }<BR> varTemp=MySet2->GetCollect("内容二");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> pBC->content2=strTemp;<BR> }<BR> varTemp=MySet2->GetCollect("内容三");<BR> if(V_VT(&varTemp)!=VT_NULL)<BR> {<BR> strTemp=(TCHAR *)_com_util::ConvertBSTRToString(V_BSTR(&varTemp));<BR> pBC->content3=strTemp;<BR> }<BR> MySet2->MoveNext();<BR> }<BR>}<BR>void CMydo::MyRealeaseAll()<BR>{<BR> CString strKey;void * pHPC;<BR> POSITION pos=m_mapParam.GetStartPosition();<BR> while(pos)<BR> {<BR> m_mapParam.GetNextAssoc(pos,strKey,pHPC);<BR> delete (HnParamContent *)pHPC;<BR> }<BR> pos=m_mapBack.GetStartPosition();<BR> while(pos)<BR> {<BR> m_mapBack.GetNextAssoc(pos,strKey,pHPC);<BR> delete (BackContent *)pHPC;<BR> }<BR> m_pConn.Release();<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>
回复者:金沐灶 回复日期:2003-10-26 20:45:51
<br>内容:另外,忘了说,CMydo的构造函数和析构函数是空的。以上两个函数被CRealcomDlg初始化和释放时调用。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -