我们知道在C++中动态开辟空间时是用字符new和delete的。其中使用new test[N]方式开辟空间时实际上是开辟了(N*sizeof(test)+4)字节的空间。如图示其中保存N的值主要用于析构函数中析构对象的次数delete[] p时先取N(*((int*)p-1))。我们参照这种机制在实现String类的时候提供一个计数,将指向new开辟的空间的指针个数保存下来,当计数不小于或不等于0时不进行析构对象,也不释放空间。直到计数为0时释放空间。
String的所有赋值、拷贝构造操作,计数器都会 +1 ; string 对象析构时,如果计数器为 0 则释放内存空间,否则计数器 -1 。实现代码如下
1 //引用计数方法 2 int my_strlen(const char *p) 3 { 4 int count = 0; 5 assert(p); 6 while (*p != '\0') 7 { 8 p++; 9 count++; 10 } 11 return count; 12 } 13 char* my_strcopy(char* dest, const char* str) 14 { 15 assert(dest != NULL); 16 assert(str != NULL); 17 char* ret = dest; 18 while (*de