【发布时间】:2017-01-09 13:23:49
【问题描述】:
根据 CString 的 GetBufferSetLength() 的 MSDN 文档,对该方法的调用之后应该是对 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);
那么,正确的代码应该在GetBufferSetLength() 之后调用ReleaseBuffer(),还是不需要调用?
编辑
根据我所做的一些测试,听起来在GetBufferSetLength() 之后调用ReleaseBuffer() 是不必要的,但是:
- 这些测试尚未完成。
- 我有兴趣根据 CString 的接口官方规范编写正确代码,而不是可能在给定版本的 VS 上工作然后在下一个版本上失败的依赖于实现的代码。
【问题讨论】:
-
你真的需要使用这个糟糕的库(MFC/ATL)吗?
-
@SergeyA:请保持话题 :) 是的,有很多 C++ 项目使用这些库。
-
全面披露 - 是我支持你的问题;)。是的,我相信,出于多种原因停止使用它们是有充分理由的。
-
@PaulMcKenzie:是的,
std::wstring::resize()更简单、更清晰 :) 但老实说用std::wstring操作然后复制回CString似乎有点过头了。 -
@Mr.C64 -- 您的编辑中的点号
2.说明了我的观点。这些据说是“有据可查”的功能,但它们是吗?我猜不是,因为你在问如何使用它们。一旦到了那个阶段,实现就真的很糟糕(用户不会弄清楚如何安全地使用公共接口)。