CString转CByteArray内存溢出
来源:互联网 发布:mac虚拟机能不能带动ps 编辑:程序博客网 时间:2024/06/05 21:04
看了一篇文章 说用CByteArray的Add函数执行效率很慢,链接 http://blog.csdn.net/guogangj/article/details/2069550
当我也需要将字符转换成BYTE时,参考了http://blog.sina.com.cn/s/blog_590be5290100euaq.html中的方法。但是当我使用第一种方法时,
int nSize = strCmd.GetLength() * sizeof(CHAR);btArray.SetSize(nSize);lstrcpy((LPTSTR)btArray.GetData(),strCmd);
出现了“heap corruption detected”,也就是内存溢出。而将最后一句改为
memcpy((LPTSTR)btArray.GetData(),strCmd.GetBuffer(),nSize);
则问题得以解决。
很明显,用memcpy指定了长度,能有效防止内存溢出。
如果将nSize的定义改为:
int nSize = strCmd.GetLength() * sizeof(TCHAR)+1;
也不会出现内存溢出。这是因为lstrcpy的原型是:
LPTSTR WINAPI lstrcpy( _Out_ LPTSTR lpString1, _In_ LPTSTR lpString2);
lpString1 must be large enough to hold lpString2 and the closing '\0', otherwise a buffer overrun may occur.即strCmd传入lstrcpy是字符串默认有'\0'的结尾符,长度需要在GetLength+1。
至此,CString转CByteArray 出现内存溢出的问题彻底搞清楚啦!接下来,继续挖lstrcpy。
lstrcpy是Windows API,实际有两个版本, lstrcpyA和lstrcpyW,分别用于ANSI和UNICODE的情况。 如果定义了UNICODE,就是lstrcpyW,否则,就是strcpy。
那么究竟strcpy和memcpy有何区别呢?
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
0 0
- CString转CByteArray内存溢出
- CByteArray与CString相互转化
- CString和CByteArray的相互转化
- CString和CByteArray的相互转化
- MFC的CByteArray、CString类用做动态字节数组使用
- 转 Android 内存溢出---Context
- 转 Android 内存溢出---Cursor
- 【转】内存溢出处理方法
- OOM内存溢出(转)
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 内存溢出
- 孙鑫MFC笔记(15)--多线程和聊天室的创建
- abap--关于sap地址,传真,邮箱的地址读取
- [C++ Primer] C++中sort对类对象进行排序
- Activity生命周期小结
- 编译型语言VS解释型语言、动态语言、静态语言
- CString转CByteArray内存溢出
- 国内从事CV相关的企业及链接(排名不分先后)
- Cocos2d-X
- Java Timer的使用(timer.schedule定时执行)
- 如何获得struts2的request response session 对象
- Linux服务程序性能评估文档
- eclipse中的快捷键
- ImageView
- ping ip 2