CString的GetBufferSetLength()是否应该匹配ReleaseBuffer()调用?

Mr.*_*C64 5 c++ string mfc atl

根据CString的MSDN文档,GetBufferSetLength()对该方法的调用之后应该匹配调用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);
Run Code Online (Sandbox Code Playgroud)

因此,应该纠正代码调用ReleaseBuffer()GetBufferSetLength(),或者是呼叫不必要的?


编辑

根据我做过的一些测试,之后听起来像是ReleaseBuffer()不必要的GetBufferSetLength(),但是:

  1. 那些测试并不完整.
  2. 我有兴趣根据CString的接口官方规范编写正确的代码,而不是依赖于实现的代码,这些代码可能适用于给定版本的VS,然后在下一个版本上失败.

Mar*_*som 4

目的ReleaseBuffer是将缓冲区包含的 C 风格字符串的状态与CString内部变量的状态同步。据推测,这只是获取最终的字符串长度并将其存储在内部,如果存在较大差异,可能会重新分配缓冲区。

在本例中,字符串长度被指定为 3 个字符。由于字符串的大小不会通过缓冲区的操作而改变,因此无需在操作后更新长度。