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

时间:2016-09-01 15:13:00

标签: c++ string mfc atl

根据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(),但是:

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

2 个答案:

答案 0 :(得分:4)

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

在示例的情况下,字符串长度被称为正好3个字符。由于字符串的大小没有通过操作缓冲区而改变,因此在操作之后无需更新长度。

答案 1 :(得分:3)

CSimpleStringT::GetBufferSetLength的文档明确无误:

  

如果您使用CSimpleStringT::GetBufferSetLength返回的指针来更改字符串内容,请在使用任何其他内容之前调用 ReleaseBuffer 更新 CSimpleStringT 的内部状态< strong> CSimpleStringT 方法。

示例代码不是契约性的。如果样本代码与正式规范相矛盾,请使用正式规范。正式的规范是契约性的。


注意:如果在没有遵循其记录的协议的情况下使用,则实现失败不是必需的。因此,您无法测试是否需要该协议的所有步骤。