WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > 开发语言 > VC/MFC

请教高高高手问题,关于memcpy()
[ 来源:ITWENKU 时间:2006-9-20 16:32:39 | 浏览:255人次 ]

void CTIKUDlg::FormatTM()
{
timu *tm;

for(POSITION P = tmlist.GetHeadPosition();NULL!=P;)
{
timu tmtemp;
tm = (timu*)(tmlist.GetAt(P));
memcpy(&tmtemp,tm,sizeof(timu));
//.....
tmlist.GetNext(P);

}

}

上面程序做了删减,假设是可以正常运行的,里包含
timu 结构体

tmlist 是一个CObList对象,里面包含了N个timu结构体。

这里想做的工作,就是得到tmlist里得到每一个timu结构(指针为tm),然后通过memcpy把贴到临时的timu结构变量tmtemp里去,然后由tmtemp里修改。。之后再做些其他的

不过很有意思就是,当执行完了memcpy(&tmtemp,tm,sizeof(timu));句之后,通过短点,成功检查出了复制的结果正是我想要的,但是执行完tmlist.GetNext(P);
tm中汉字都发生了变化,都变乱码了,而tmtemp当然生命周期结束了

我分析了一下午也没找到原因,后来怀疑是timu结构中的汉字使用的是CString保存的结果,但是具体
问题出现在哪里了,说不清,数字没问题,英文字符也不行了。


把GetNext(P);代码贴出来看看


timu结构中的汉字使用的是CString保存的结果?
因为CString内部存在一个buffer,所以做为你的timu结果的成员的话,就不能直接用memcpy了.
你需要为timu实现assignment operator(=)和copy constructor,以实现deep copy.

这个原则很我C++的书上都有讲.


memcpy 是纯拷贝内存,
如果含有指针等内容,
请使用深拷贝方式 ...

assignment operator(=) 或者是 copy constructor 均可 ...


因为指针拷贝,
指针直向的内容可能会被释放,
对于指针, 需要拷贝原指针的指向空间内容,
仅仅复制指针本身是不够的 ...

或者,你把 timu结构中的汉字使用的是CString 定义为静态的/全局的,
或者是常量方式存在整个程序生命期中 ...

 相关文章
·DLL和ActiveX相比,各自的优缺点是什么?
·求助: SPI里面怎么调用普通socket函数
·求教:DirectDraw窗口模式焦点问题.
·摄像头进行网络通讯
·如何自动检测是哪个串口
·怎麼樣把資料輸出為EXCEL

 推荐文章
求助--补全代码
如何知道一个线程还在“正常运行”
访问网络出现异常
如何将一个文件夹里的文件组织成xml描述信息
想将一些东东按拼音排序!!
求Debugging application 的sourcecode
vc开发的activex可以在网页中用吗?
请问什么时候需要为资源(例如对话框或按钮)新建一个类?
如何用SQL语言完成复杂字符串的筛选
有关DNS被屏蔽的问题?
MDI程序,如何像VC界面那样,编辑对话框时候在旁边显示标尺?
windows搜索驱动的默认路径是什么
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.