CString类的ReleaseBuffer的用处是什么

用了好多年了,才发现这个问题,写个小程序测试了,终于搞明白了:

CString str;
str = _T("1234567890");
TCHAR *p = str.GetBuffer(100); //TCHAR *p = str.GetBufferSetLength(100);
_tcscpy(p,_T("12345678111111190"));
str.ReleaseBuffer();  //测试
str += "aaa";
m_pEdit->SetWindowText(str);

上面这段程序运行后会显示 12345678111111190aaa,

如果去掉str.ReleaseBuffer();这行,就会显示234567811aaa

这是因为ReleaseBuffer()并不是释放整个Buffer,而是释放掉字符串后面无效的Buffer。

如果不执行,CString还是原来的长度,因为程序不清楚,分配的100这个大空间到底要用多少。

str += "aaa";这行为什么不自动计算长度,因为CString可以包含\0的,

比如用TCHAR *p = str.GetBufferSetLength(100);这个长度会更新到CString str中。

str += "aaa"后str的长度103,但Edit显示不了aaa,被null截掉了,但对于二进制文件,却是一种应用场景。

 

这些都要因为方便而简化的写法导致的混淆含义,若是显式无歧义的写法(字符串处理):

参数其实是保留的长度。释放的是多余的空间。

CString str;
str = _T("1234567890");
TCHAR *p = str.GetBuffer(100);
PRINT("LEN= %d ", strlen(p));
_tcscpy(p,_T("12345678111111190"));
int len = _tcslen(p);
str.ReleaseBuffer(len);
str += "aaa";
m_pEdit->SetWindowText(str);

posted @ 2024-09-14 11:49  XGZ21  阅读(14)  评论(0编辑  收藏  举报