根据CString GetBufferSetLength()
的MSDN文档,对该方法的调用之后应匹配对enableHangupSupport()
的调用。
但是,在同一页面的示例代码中,评论指出调用ReleaseBuffer()
不必要:
ReleaseBuffer()
那么,应该在CSimpleString str(pMgr);
LPTSTR pstr = str.GetBufferSetLength(3);
pstr[0] = _T('C');
pstr[1] = _T('u');
pstr[2] = _T('p');
// No need for trailing zero or call to ReleaseBuffer()
// because GetBufferSetLength() set it for us.
str += _T(" soccer is best!");
ASSERT(_tcscmp(str, _T("Cup soccer is best!")) == 0);
之后更正代码调用ReleaseBuffer()
,还是不需要调用?
修改
根据我做过的一些测试,在GetBufferSetLength()
之后听起来像是不需要ReleaseBuffer()
,但是:
答案 0 :(得分:4)
ReleaseBuffer
的目的是将缓冲区包含的C样式字符串的状态与CString
内部变量的状态同步。据推测,这只是获取最终的字符串长度并在内部存储它,如果存在很大的差异,可能会重新分配缓冲区。
在示例的情况下,字符串长度被称为正好3个字符。由于字符串的大小没有通过操作缓冲区而改变,因此在操作之后无需更新长度。
答案 1 :(得分:3)
CSimpleStringT::GetBufferSetLength的文档明确无误:
如果您使用CSimpleStringT::GetBufferSetLength返回的指针来更改字符串内容,请在使用任何其他内容之前调用 ReleaseBuffer 更新 CSimpleStringT 的内部状态< strong> CSimpleStringT 方法。
示例代码不是契约性的。如果样本代码与正式规范相矛盾,请使用正式规范。正式的规范是契约性的。