以下是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
待续