CString中调用GetBuffer后为什么还要调用ReleaseBuffer

以下是CString的数据存储结构:

struct CStringData
{
    IAtlStringMgr* pStringMgr;  // String manager for this CStringData
    int nDataLength;  // Length of currently used data in XCHARs (not including terminating null)
    int nAllocLength;  // Length of allocated data in XCHARs (not including terminating null)
    ..........
    ..........

}

其中:nDataLength是存储数据用到的长度。当调用CString的方法进行数据的相应操作时,就使用这个长度。

           nAllocLength是申请的数据区长度。只在申请空间时用到。

 

接下来再看一下CString的两个方法:

    GetBuffer()与GetBuffer(_In_ int nMinBufferLength)

    这两个方法都是获取数据存储地址,这两个函数的调用都不会改变nDataLength的大小,只有再次调用方法ReleaseBuffer(_In_ int nNewLength = -1)时,才会更新nDataLength长度。当nMinBufferLength长度大于当前数据长度时,会重新申请内存,并将原有数据复制过来。

1、当调用两个GetBuffer方法后,不通过数据地址对数据进行任何改变时,可以不用调用ReleaseBuffer方法

2、列几个例子:

        String s("12345678");
	char *p = s.GetBuffer(4); 
	memcpy(p, "8765", 4); //	
      //此时 s = "87655678",s.GetLength()=8
	s.ReleaseBuffer(-1); //此时 s = "87655678",s.GetLength()=8
	s.ReleaseBuffer(4);  //此时 s = "8765",s.GetLength()=4

待续

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值