在程序开发中, 字符串是我们经常使用的一个东西 . 在 C 语言中 , 我们经常使用 char* 来操作字符串 .char* 虽然在使用上比较直观 , 但在内存管理上面却不怎么方便 . 手动开辟和释放内存也是一项比较麻烦的操作 . 而且还有考虑内存泄漏 , 和内存越界的一系列容易出问题的地方 . 而且字符串操作需要频繁地对内存进行 new 和 delete ,次数多了也会造成内存碎片过多而影响程序的性能 . 因此 , 在所有的比较出名的 C++ 基础类库中都有封装的 string 类. 比如 stl,qt,mfc 这些库里面都有 string 类的封装. 本文的主旨就是剖析 mfc 中 CString 的内存管理以及它内部所使用的一些优化策略. 本文剖析的源代码是 vc6.0 中的 CString .其他版本的会不同 .
首先介绍 cstring 内部的一个数据结构 CStringData .
struct CStringData
{
long nRefs; //引用计数
int nDataLength; //实际数据 ( 字符串 ) 长度
int nAllocLength; //实际开辟的内存长度
// TCHAR data[nAllocLength]
TCHAR* data() //实际字符串首地址 .
{ return (TCHAR*)(this+1); }
};
这是 string 用于存放字符串和内存信息的一个数据结构. 我们经常使用的 getbuffer 方法就是调用这个数据结构的 data 方法.
内存的开辟
在 cstring