关于memcpy的一个问题!!!请高手解疑!

bazzi2011 2014-06-10 04:47:04


CDlg dlg;
if(dlg.DoModal() == IDOK)
{
STRUCT_INFO str_info;
STRUCT_INFO *pStr_info = new STRUCT_INFO ;
//第一种
memset(&str_info, 0, sizeof(STRUCT_INFO));
memcpy(&str_info, dlg.m_pstrInfo, sizeof(STRUCT_INFO));
//第二种
memset(pStr_info, 0, sizeof(STRUCT_INFO));
memcpy(pStr_info, dlg.m_pstrInfo, sizeof(STRUCT_INFO));

CDlg是个对话框,类里面定义了一个结构体指针STRUCT_INFO m_pstrInfo。
现在我在主对话框中打开该对话框,在对话框中输入了一些数据,存在了m_pstrInfo这个指针中。现在我要在主对话框中复制它另作他用。
现在的问题就是无论用指针的方式还是变量的方式,用以上两种方式memcpy后,得到的值都不是很正确,比如一个字符串是'abc',拷贝之后,就变为了'乱码bc',有了乱码,只显示出bc两个字母,a不见了。

我想问的是:是不是在dlg.DoModal() == IDOK这个ok按钮按下之后,其类中定义的结构体指针指向的空间就被回收了?再memcpy它就有不确定性了?如果是,该怎样解决?
...全文
308 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WoMaiMengXiang 2018-05-13
  • 打赏
  • 举报
回复
[quote=引用 5 楼 lostying 的回复:] 问下 DDRAW lock那个 你解决了吗?? 就是WIN8 以上系统
bazzi2011 2014-06-12
  • 打赏
  • 举报
回复
自己解决了,原来赋值错了!
无言猪 2014-06-11
  • 打赏
  • 举报
回复
memcpy肯定是可靠的,这个不用怀疑。可以加断点,memcpy完后开两个memory watch,对比str_info和dlg.m_pstrInfo的内存内容,忽略掉对齐之类的影响。
hhhh63 2014-06-10
  • 打赏
  • 举报
回复
引用 2 楼 roy896028 的回复:
在对话框关闭后应该已经调用析构了
对话框关闭的时候是不会调用析构函数的,等到这个函数结束时才调用析构函数。 问题可能出在STRUCT_INFO里面,是不是包括字符串指针或CString类等,如果这样就不能复制过来了,要另外复制。 把STRUCT_INFO贴出来看看。
shenyi0106 2014-06-10
  • 打赏
  • 举报
回复
应该是STRUCT_INFO这个结构体字节没对齐, 比如: struct ttt { char a; int b; }; 这时sizeof(struct ttt) = 8 你自己算一下看STRUCT_INFO是多少个字节,然后在用sizeof算一下,看是否一致?
tmac_roy 2014-06-10
  • 打赏
  • 举报
回复
在对话框关闭后应该已经调用析构了,楼主可以这样
int A;
 CDlg* pdlg = new CDlg;
 if( IDOK==pdlg->DoModal() )
  {
      //do something 

  }
  delete pdlg;
zhousitiaoda 2014-06-10
  • 打赏
  • 举报
回复
对话框关闭了,但对话框变量还在,所以对话框变量的成员变量依旧有效(如果成员变量跟MFC有关,比如关联了控件那就另说),另外看你在窗口退出时有没有操作m_pstrInfo。最后贴上STRUCT_INFO的定义看看,如果STRUCT_INFO的定义包含对象或者指针,你直接memcpy是不对的。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧