CString::GetBufferSetLength与GetBuffer的区别及使用疑问
CString::GetBufferSetLength 与 GetBuffer 的核心区别及你的场景适配
一、两个函数的本质差异
内存与长度处理逻辑
GetBuffer(some_size):仅保证内部缓冲区的容量≥some_size(不含终止符),不会修改CString当前的长度,也不会初始化缓冲区内容。如果原缓冲区足够大,直接返回原指针;不足则自动扩容。GetBufferSetLength(some_size):直接将CString的当前长度设置为some_size,同时确保缓冲区容量足够容纳这些字符(自动扩容或截断),并且会重置缓冲区的前some_size个字符为0。
长度状态的时效性
- 调用
GetBuffer后,CString的GetLength()返回值仍为调用前的原始长度,直到调用ReleaseBuffer时才会更新长度。 - 调用
GetBufferSetLength后,GetLength()直接返回some_size,长度已提前生效。
- 调用
二、ReleaseBuffer 与 ReleaseBufferSetLength 的区别
ReleaseBuffer(n):将CString的长度更新为n(需确保缓冲区前n个字符有效);若不传n,则自动从缓冲区开头查找\0,以此位置作为新长度。ReleaseBufferSetLength(n):强制将CString的长度设置为n,不依赖缓冲区中的\0,只需确保缓冲区容量≥n。
三、你的场景适配方案
你的需求是填充恰好somelength个非空字符,最终让foo准确包含这些字符,推荐两种规范写法:
写法1:使用 GetBufferSetLength + ReleaseBuffer
CStringA foo; char *p = foo.GetBufferSetLength(somelength); FillCharBufferWithStuff(p, somelength); foo.ReleaseBuffer(); // 无需传参,GetBufferSetLength已预设长度
- 优势:逻辑最直接,
GetBufferSetLength提前锁定目标长度,填充后无参ReleaseBuffer即可确认长度。
写法2:使用 GetBuffer + ReleaseBuffer(somelength)
CStringA foo; char *p = foo.GetBuffer(somelength); FillCharBufferWithStuff(p, somelength); foo.ReleaseBuffer(somelength); // 必须传参,明确指定新长度
- 注意:绝对不能调用无参
ReleaseBuffer()——你的缓冲区没有\0,无参调用会越界查找终止符,导致长度错误或程序崩溃。
关于 ReleaseBufferSetLength 的使用
在你的场景中,ReleaseBufferSetLength(somelength)也可以替代上述ReleaseBuffer调用,但属于冗余操作——你已经明确填充了指定长度的内容,常规ReleaseBuffer足够完成需求。
内容的提问来源于stack exchange,提问作者Jabberwocky
相关产品推荐
相关产品推荐

