zoukankan      html  css  js  c++  java
  • c语言模拟实现oc引用计数

    #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;

    }

     

    //对应ocrelease方法

    void xrelease(void *p)

    {

       int * realp = (int *)p-1;

       if(realp[0]==1 )

       {

            printf("内存[%p]在被真正释放... ",p);

            free(realp);

       }

       else

            realp[0]--;

    }

    //对应ocretain方法

    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 ",p, xretainCount(p));

     

        int *q = xretain(p);//p指向的内存的计数为: 2 

        //   q = [p retain];

        

        printf("p:[%p]指向的内存的计数为:%d ", p,xretainCount(p));

     

        xrelease(p); //p指向的内存的计数为: 1

        printf("q:[%p]指向的内存的计数为:%d ",q, xretainCount(q));

        xrelease(q); //q指向的内存会被真正释放掉

        return 0;

      //一个大神写的模拟引用计数机制

    }

  • 相关阅读:
    编程开发之--单例模式(2)
    编程开发之--单例模式(1)
    oracle 存储过程
    数据结构与算法之--最大公约数、最小公倍数
    编程开发之--Oracle数据库--存储过程使用动态参数绑定(3)
    软件开发之常用的工具
    Oracle PL/SQL学习之你需要知道的快捷键
    Linux下安装Tomcat服务器和部署Web应用
    如何在linux下安装tomcat服务器
    CentOS7 64位安装mysql教程
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/4960364.html
Copyright © 2011-2022 走看看