全局变量在return之后变化,请大家帮忙看下是哪里的问题
功能:在listview中双击某一行,弹出窗口显示对应的结构图来。
双击函数:
- C/C++ code
ClistView::OnLButtonDbClk(UINT nFlag,CPoint point){ CListCtrl &clsList = GetListCtrl(); POSITION pos = clsList.GetFirstSelectedItemPosition(); if(pos == NULL) return; int nItem = clsList.GetNextSelectedItem(pos); CString strPoint = clsList.GetTextText(nItem,5); //获取点击的内容 CDlgShowStruct dlg;//弹出的显示窗口 DWORD nCnt = theApp.m_dwStructNum; //传到app里面,接收到的结构总数 BOOL bFound = FALSE; int i = 0; for(i = 0;i<nCnt;i++) { if(theApp.m_MsgStr[i].szMsgID.CompareNoCase(strPoint) == 0) { bFound = TRUE; memcpy(&dlg.msgItem,&theApp.m_MsgStr[i],sizeof(theApp.m_MsgStr[i]));//将匹配的结构拷入对话框的变量 break; } } if(bFound) dlg.DoModul(); return;//此处之后出问题}//这里的MsgStr和MsgItem有相同的结构typedef struct MsgStruct_S{ int nMsgID; int nStructNum;//包含的结构的个数 CString szMsgID;//结构ID 的字符串表示 CString szTypeName[128];//该ID下的结构的各个名称 CString szTypeInfo[128];//名称对应的类型};//上面这个的结构就类似我们VC的watch窗口里面,当我们要选择某个变量查看其具体结构时的样子//该List的显示样子Index MsgID MsgContent ...0001 CCL_DLL_XXX 01 01 01 01...0002 DLL_SP_XXX FF FF 0F 0F......之前我已经发过一个帖子求助,当时是刚开始做,心里什么底也没有,属于毫无了解。
现在过去了一个多星期,陆陆续续地解决了一些问题,比如读取头文件,将里面的消息结构读取到上面这个结构数组里面,
把它保存到theApp类变量中,这个应该类似全局变量那样,各个地方都可以访问到(public下)。
现在的问题是,当我双击上面的某行数据,它会弹出窗口,里面包含有我传入的对应数据,就是msgItem,跟踪多次也是传入正确的,然后关闭它,当双击,关闭,这个时候,theApp.m_MsgStr中对应的那个结构就变化了,在memory中全部变成了DD。
我将断点设置在return那里,然后按F9,进入到CString的析构函数里面
- C/C++ code
CString::~CString(){ if(GetData()!=_afxDataNil) if(InterLockedDecrement(&GetData->nRef)) FreeData(GetData());}//进入这里这个函数2次,在return那里F9,这是为什么?//比如我该字段的保存地址是0x00a93e1c,保存uint 16这个字符串,然后在其上的12个字节处为02,弹出一次后变为01,再一次就变为了DD,并且在本地址所在行以上的48个字节均变为DD,这个字段是theApp.m_MsgStr中一个结构的地址,就只属于这个部分的地址内容变化了,保存的其他结构的内容均没有变化,这个是为什么呢?示意图0x00000001 12 12 23 32 32 32 32 32 32 32 43 320x0000000d ff 43 65 76 87 89 21 df fd 43 65 760x0000001a 02 dd ff ff ee ff ee ff ee ff ee ff0x00000026 57 91 83 90 76 33 ed cd a7 88 98 90 //这行才是我储存数据的地址,数据内容是假的,具体的忘了0x000000xx xx.....//储存的其他数据然后第一次弹出并运行到return后,0x0000001a ——>01 dd ff ff ....//变为了这个,然后在双击弹出对话框//然后再次运行到return处0x00000001 ——>0x00000026均变为了DD,而我在其他的地方都没有使用保存好的结构,或者说,我在弹出框返回后,就只是在单纯的双击让它弹出对话框,但它在第三次开始,第二次return之后,数据就变化了,实在想不出什么理由来,希望能有人帮个忙看看[解决办法]
既然是结构体里面有CString类型的成员,你怎么可能用memcpy(&dlg.msgItem,&theApp.m_MsgStr[i],sizeof(theApp.m_MsgStr[i]));这样的代码呢?别用c的思想来玩c++