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

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

}

c语言模拟实现oc引用计数的更多相关文章

  1. oc引用计数原理-引用计数相关变化

    http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实 ...

  2. OC - ARC(自动引用计数)

    1.什么是自动引用计数? 顾明思义,自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术. 在OC中采用ARC机制,让编译器来进行内存 ...

  3. OC中的自动引用计数

    目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Count ...

  4. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  5. OC中对象元素的引用计数 自动释放池的相关概念

    OC中数组对象在是如何处理对象元素的引用计数问题的,同时介绍一下自动释放池的相关概念 一.数组对象是如何处理对象元素的引用计数问题[objc]  view plaincopy 1. //   2. / ...

  6. 初步swift语言学习笔记6(ARC-自己主动引用计数,内存管理)

    笔者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/31824179 转载请注明出处 假设认为文章对你有所帮助.请通过留言 ...

  7. C语言的引用计数与对象树

    引用计数与对象树 cheungmine 2013-12-28 0 引言 我们经常在C语言中,用指针指向一个对象(Object)的结构,也称为句柄(Handle),利用不透明指针的技术把结构数据封装成对 ...

  8. 内存管理 垃圾回收 C语言内存分配 垃圾回收3大算法 引用计数3个缺点

    小结: 1.垃圾回收的本质:找到并回收不再被使用的内存空间: 2.标记清除方式和复制收集方式的对比: 3.复制收集方式的局部性优点: https://en.wikipedia.org/wiki/C_( ...

  9. Swift5 语言指南(二十五) 自动引用计数(ARC)

    Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...

随机推荐

  1. SQL Server安全(3/11):主体和安全对象(Principals and Securables)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  2. React-Native 给客户端来个「同音词模糊搜索」

    APP上线一段时间有用户反应说不方便找东西,其实APP的数据不大也就三四百条而以,但受限于手机端展示区域太小.信息大爆炸,大家也基本上不会去记具体的名称都是根据模糊的印象进行搜索而且现在大家基本都用拼 ...

  3. Windows 8 应用商店无法连接到网络的终极完美解决方案

    当你看到以下几个步骤的时候,你可能会不以为然,因为你已经试过了,还是没成功,依然提示"你的电脑没有连接到Internet或者现在无法使用Windows应用商店,要使用Windows应用商店, ...

  4. C# 6.0的属性(Property)的语法与初始值

    昨晚有学点新知识,是有关C# 6.0的. 在数据库创建有一张表: CREATE TABLE [dbo].[ToolLocation] ( ,) NOT NULL PRIMARY KEY, ) NOT ...

  5. 年薪10w和年薪100w的人,差在哪里?

    职场10年,为什么有人已经当上了董事总经理,而有的人还是资深销售经理? 出道10年,为什么有人已经当上了主编.出版人,而有的人还是资深编辑? 打拼10年,为什么有人已经身价数十亿美金,而有的人还在为竞 ...

  6. 下一代USB接口将支持双向拔插,于明年亮相

    近日,USB接口标准制定组织表示新一代USB接口将于明年年中亮相,而其名称目前被暂定为了USB Type-C.该组织表示USB Type-C标准将允许制造商采用更纤薄的接口设计,在实用性大大提高的同时 ...

  7. HTML 5表单应用小结

    本文内容        HTML 5表单的组织方式         HTML 5表单的新增特性        访问表单控件及响应表单控件事件 HTML 5表单的组织方式 ★  将表单字段及其标签关联起 ...

  8. iOS阶段学习第四天笔记(循环)

    iOS学习(C语言)知识点整理笔记 一.分支结构 1.分支结构分为单分支 即:if( ){ } ;多分支 即:if( ){ }else{ }  两种 2.单分支 if表达式成立则执行{ }里的语句:双 ...

  9. Windows Server 2008 R2 负载平衡入门篇

    一.简单介绍负载均衡 负载均衡也称负载共享,它是指负载均衡是指通过对系统负载情况进行动态调整,把负荷分摊到多个操作节点上执行,以减少系统中因各个节点负载不均衡所造成的影响,从而提高系统的工作效率.在常 ...

  10. C#中在AxWebBrowser控件注入JS脚本的方法

    /// <summary> /// 窗体加载 /// </summary> private void JS_Load(object sender, EventArgs e) { ...