我們知道在C++中動態(tài)開辟空間時是用字符new和delete的。其中使用new test[N]方式開辟空間時實(shí)際上是開辟了(N*sizeof(test)+4)字節(jié)的空間。如圖示其中保存N的值主要用于析構(gòu)函數(shù)中析構(gòu)對象的次數(shù)delete[] p時先取N(*((int*)p-1))。我們參照這種機(jī)制在實(shí)現(xiàn)String類的時候提供一個計(jì)數(shù),將指向new開辟的空間的指針個數(shù)保存下來,當(dāng)計(jì)數(shù)不小于或不等于0時不進(jìn)行析構(gòu)對象,也不釋放空間。直到計(jì)數(shù)為0時釋放空間。
String的所有賦值、拷貝構(gòu)造操作,計(jì)數(shù)器都會 +1 ; string 對象析構(gòu)時,如果計(jì)數(shù)器為 0 則釋放內(nèi)存空間,否則計(jì)數(shù)器 -1 。實(shí)現(xiàn)代碼如下
1 //引用計(jì)數(shù)方法 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