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
原创粉丝点击