关于GetBuffer的问题,急!!!!!!!!!!

emahj 2013-02-07 01:06:17
请教一个问题:
下面这段代码,这样运行在str = "22222222222222222222"会报错;注释掉memcpy(p,tbuf,strlen(tbuf));就没问题了。
这是什么原因?
根据本人以往的经验,ReleaseBuffer之后, CString类型又可以恢复到自动申请空间的状态啊。

CString str;
int len = 0;
LPTSTR p = NULL;
char tbuf[60];
memcpy(tbuf,"22222222222222222222",strlen("22222222222222222222"));
str = "abc";
p = str.GetBuffer(10);
len = str.GetLength();
memcpy(p,tbuf,strlen(tbuf));

str.ReleaseBuffer(10);
len = str.GetLength();
str = "22222222222222222222";
len = str.GetLength();
...全文
2289 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
今晚又失眠 2013-02-18
  • 打赏
  • 举报
回复
CString 会不停的申请、释放内存。如果可以的话,还是自己写一个类似的类吧
emahj 2013-02-17
  • 打赏
  • 举报
回复
谢谢各位 经过一段时间琢磨,发现此问题跟CString结构体有关。主要原因是直接对CString的pchData中数据进行了操作,但没有改变CString隐藏的变量,如数据长度等;所以再一次对str赋值时,由于数据的长度大于之前申请的数据长度10,需要重新申请内存空间。而str数据结构内变量不一致导致运行出错。
Eleven 2013-02-07
  • 打赏
  • 举报
回复
memcpy是按字节copy,不是字符~
Eleven 2013-02-07
  • 打赏
  • 举报
回复
CString str;    
	int len = 0;  
	LPTSTR  p = NULL;  
	TCHAR tbuf[60]={0};  
	memcpy(tbuf,_T("22222222222222222222"),(_tcslen(_T("22222222222222222222"))+1) * sizeof(TCHAR));   
	str = _T("abc");    
	p = str.GetBuffer(_tcslen(tbuf)+1);   
	len = str.GetLength();    
	memcpy(p,tbuf,(_tcslen(tbuf)+1) * sizeof(TCHAR));   
	str.ReleaseBuffer();    
	len = str.GetLength();    
	str = _T("22222222222222222222");   
	len = str.GetLength();
china_jeffery 2013-02-07
  • 打赏
  • 举报
回复
引用 6 楼 china_jeffery 的回复:
楼主的代码改成 C/C++ code?123456789101112131415 CString str; int len = 0; LPTSTR p = NULL; TCHAR tbuf[60]={0}; memcpy(tbuf,_T("22222222222222222222"),_tcslen(_T("222222222222222……
求解释
china_jeffery 2013-02-07
  • 打赏
  • 举报
回复
楼主的代码改成

CString str;
int len = 0;
LPTSTR p = NULL;
TCHAR tbuf[60]={0};
memcpy(tbuf,_T("22222222222222222222"),_tcslen(_T("22222222222222222222"))+1);
str = _T("abc");
p = str.GetBuffer(10);
len = str.GetLength();

memcpy(p,tbuf,_tcslen(tbuf)+1);

str.ReleaseBuffer(10);
len = str.GetLength();
str = _T("22222222222222222222");
len = str.GetLength();


单步执行,发现执行memcpy(p,tbuf,_tcslen(tbuf)+1); 后,p的值为
jimette 2013-02-07
  • 打赏
  • 举报
回复
关键你那个用的是copy用+= 试试
emahj 2013-02-07
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
tBuf没有初始化,因此strlen(tBuf)风险很大,无法预知会是多少
感觉跟CString GetBuffer后,变量能否支持自动变长功能。
china_jeffery 2013-02-07
  • 打赏
  • 举报
回复

char tbuf[60]={0};
快乐鹦鹉 2013-02-07
  • 打赏
  • 举报
回复
tBuf没有初始化,因此strlen(tBuf)风险很大,无法预知会是多少
guolaikk 2013-02-07
  • 打赏
  • 举报
回复
引用 楼主 emahj 的回复:
根据本人以往的经验,ReleaseBuffer之后, CString类型又可以恢复到自动申请空间的状态啊。 CString str; int len = 0; L……
根据你以往的经验,拷贝字符串的时候strlen("22222222222222222222")不需要加1? 报的什么错你也不说

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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