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;

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

    }

  • 相关阅读:
    MFC tab页面中获到其它页面的数据
    sqlite数据库中"Select * From XXX能查到数据,但是Select DISTINCT group From xxx Order By group却查不出来
    关闭程序出现崩溃(exe 已触发了一个断点及未加载ucrtbased.pdb)
    springboot 通用Mapper使用
    springBoot 发布war包
    springCloud Zuul网关
    springboot hystrix turbine 聚合监控
    springBoot Feign Hystrix Dashboard
    springBoot Ribbon Hystrix Dashboard
    springBoot Feign Hystrix
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/4960364.html
Copyright © 2011-2022 走看看