#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;
//一个大神写的模拟引用计数机制
}