程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> c語言模擬實現oc引用計數,oc引用計數

c語言模擬實現oc引用計數,oc引用計數

編輯:關於C語言

c語言模擬實現oc引用計數,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;

}

 

//對應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;

  //一個大神寫的模擬引用計數機制

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved