#include<stdio.h>
#include<stdlib.h>
//在c中引入 引用計數機制
// 要解決的問題: 1,指向某塊動態內存的指針有幾個?
// 應該讓這塊動態內存記錄指針的數量
// 所以開辟的動態內存大小應該取多大?
// 如果:c的指針需要開辟n個字節,
// 那麼實際上應該開辟n+4個字節
// 假設c中: void *p = xalloc(8)
// 則:實際上在xalloc中應該調:
// int *realp =malloc(12)
// 假設內存如下:
// [_ _ _ _ _ _ _ _ _ _ _ _]
// ^ ^
// | |
// | |
// realp p
//
// 釋放過程: xrelease(p)
//這個函數對應oc 的 alloc方法
void * xalloc(int size)
{
int *realp = malloc(size+4);
/**realp=1; */
realp[0]=1;
return realp+1;
}
//對應oc的release方法
void xrelease(void *p)
{
int * realp = (int *)p-1;
if(realp[0]==1 )
{
printf("內存[%p]在被真正釋放...\n",p);
free(realp);
}
else
realp[0]--;
}
//對應oc的retain方法
void * xretain(void *p)
{
int * realp = (int *)p-1;
realp[0]++;
return p;
}
//對應oc的 retainCount方法
int xretainCount(void *p)
{
return *((int*)p-1);
}
int main(int argc, char **argv)
{
int *p = xalloc(4); //p指向的內存的計數為: 1
printf("p:[%p]指向的內存的計數為:%d\n",p, xretainCount(p));
int *q = xretain(p);//p指向的內存的計數為: 2
// q = [p retain];
printf("p:[%p]指向的內存的計數為:%d\n", p,xretainCount(p));
xrelease(p); //p指向的內存的計數為: 1
printf("q:[%p]指向的內存的計數為:%d\n",q, xretainCount(q));
xrelease(q); //q指向的內存會被真正釋放掉
return 0;
//一個大神寫的模擬引用計數機制
}