用了好多年了,才发现这个问题,写个小程序测试了,终于搞明白了:
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);