`
cppmule
  • 浏览: 446453 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

内存管理之引用计数

    博客分类:
  • C++
阅读更多
一、什么是引用计数?
   引用计数是内存管理的一个技巧,可以看做是一种简单的垃圾回收机制,它允许多个拥有共同值的对象共享同一个对象。

二、为什么采用它?
   对于没有垃圾自动回收机制的语言(如C/C++)和技术(如COM)来说,引用计数提供了一种简洁高效的内存管理方法。
它简化了跟踪处理堆中对象的过程。
      一个对象被从堆中分配出来之后,我们需要明确的知道是谁拥有了这个对象,因为只有拥有这个对象的所有者能够销毁它。但我们在实际使用过程中, 这个对象可能被传递给另一个对象(例如通过传递指针参数),一旦这个过程复杂,我们很难确定谁最后拥有了这个对象。
     使用引用计数就可以抛开这个问题,我们不需要再去关心谁拥有了这个对象,因为我们把管理权交割给了对象自己(这有点类似__stdcall和__cdecl两种函数调用约定)。当这个对象不再被任何人使用时,它自己负责销毁自己。
简单并且高效。
     简单是特定时候增减一下对象的引用计数就可以了。高效是让多个具有相同值的对象共享同一个对象,省却了拷贝复值的过程,而且更加节省内存和宝贵的CPU时间。

三、谁都在使用它?
   现在很多技术和编程语言都在使用它,如COM,Object-C等,如果我们愿意,我们可以在自己的程序中使用它。
COM
    IUnknow提供了三个接口:QueryInterface、AddRef、Release。后面两个分别用来增减和减少通过QueryInterface获取的接口对象的引用计数,当内部的计数为0时,接口对象自动销毁自身。
COM的宿主DLL
    这种类型的DLL包含四个导出函数:DLLRegisterServer、DLLUnregisterServer、DLLGetClassObject、DLLCanUnloadNoew。最后一个函数就是通过查看DLL维护的组件的计数值来决定这个DLL是否可以被CoFreeUnusedLibraries卸载掉。
Object-C
    Object-C作为C的派生语言,它的内存管理彻底的采用了这个技巧。它的Foundation框架提供了是哪个方法:autoreleae、retain、release。第一个是将一个对象交由自动释放池管理,其实是自动调用了release;后面两个和COM中的最后两个是相同的,分别用来增加和减少引用计数。

四、我该如何实现它?
   下面我给出一个很简单的例子,演示如何实现引用计数。
 
class Foo{
public:
    Foo(){
        _ref = 1;//构造成功之后计数即为1
    }
    //辅助,用来打印引用计数
    void Print(){ 
        std::cout << "_ref = " << _ref << std::endl;
    }
public:
    //增加引用计数
    ULONG AddRef(){
        return InterlockedIncrement(&_ref);
    }
    //减少引用计数
    ULONG Release(){
        if (0 == InterlockedDecrement(&_ref)){
            delete this;
            return 0;
        }
        return _ref;
    }
private:
    long _ref;
};

int main(int argc, char *argv[])
{
    Foo * foo = new Foo;
    foo->Print();//输出:_ref = 1
    foo->Release();
    foo->Print();//输出:_ref = 随机数字

    return 0;
}

PS: 这里是云风写的一篇文章《引用计数与垃圾回收之比较》,我认为写的非常好。
分享到:
评论

相关推荐

    COM学习——动态绑定之引用计数

    COM的核心概念是对象、接口和组件,其中动态绑定是COM的重要特性之一,尤其在处理引用计数时显得尤为重要。 动态绑定是指在运行时确定对象的方法调用,而不是在编译时。这使得COM对象可以灵活地适应不同的实现,...

    Swift编程中用以管理内存的自动引用计数详解

    自动引用计数(Automatic Reference Counting,简称ARC)是Swift实现内存管理的一种方式,它自动跟踪并管理对象的生命周期,避免了手动释放内存的繁琐工作。本文将深入探讨Swift中的自动引用计数以及与其相关的概念...

    COM-引用计数

    引用计数是COM实现对象生命周期管理的关键机制,尤其在内存管理方面起到重要作用。 引用计数的基本原理是,每当一个客户端(如另一个对象或程序)获得对COM对象的引用时,该对象的引用计数就会增加1;当客户端不再...

    引用计数的c++源码实现

    引用计数是一种常见的内存管理策略,特别是在C++中,它被用于智能指针类,如`std::shared_ptr`和`std::weak_ptr`。在本项目中,我们看到一个用C++实现的引用计数系统,这个系统可能是为了自定义的智能指针或者对象...

    ios5之自动引用计数

    ### iOS5之自动引用计数 #### 概述 在iOS5中,苹果引入了一项重大的内存管理改进——自动引用计数(Automatic Reference Counting,简称ARC)。这项技术简化了开发者对内存管理的需求,使得他们能够更加专注于应用...

    智能指针与引用计数详解

    智能指针是C++编程中一个非常...总之,智能指针与引用计数是C++中管理动态内存的重要工具,通过理解和掌握这些知识,程序员可以编写出更加安全、高效的代码。通过分析和实践这个demo,将有助于深化对这一主题的理解。

    深入 Swift 的自动引用计数(ARC):内存管理的高效策略

    Swift 语言的自动引用计数(Automatic Reference Counting,简称 ARC)是一种先进的内存管理技术,用于在编译时自动插入引用计数代码,以确保应用程序不会消耗过多内存或导致内存泄漏。本文将详细探讨 ARC 的工作...

    C++引用计数设计与分析(解决垃圾回收问题).docx

    引用计数是C++中解决动态内存管理的一种策略,特别是在需要避免内存泄漏的情况下。引用计数的基本思想是跟踪和记录对象被引用的次数。每当一个对象被创建或复制时,其引用计数增加1。当对象被销毁或复制到其他地方时...

    复杂数据类型变量的引用计数与block以及__block修饰符的关系

    同时,需要注意的是,由于ARC(自动引用计数)的引入,在现代的Objective-C编程实践中,开发者通常不需要直接管理引用计数,ARC会自动处理大部分内存管理任务,但在了解ARC如何工作的背后,仍然需要对引用计数和...

    iOS内存管理中引用计数的学习

    本文主要讨论的是iOS内存管理中的引用计数机制,这是Objective-C和Swift(早期版本)中的一种自动内存管理策略。 引用计数是一种跟踪和管理对象生命周期的方法。简单来说,一个对象的引用计数表示了有多少个指针...

    Object-C内存管理2-对象之间的内存管理

    总结,Objective-C的对象之间内存管理涉及多个方面,包括引用计数、强引用、弱引用、无主引用、内存管理规则、避免内存泄漏、代理模式和Block的处理。熟练掌握这些概念和技巧,能够编写出更健壮、高效的代码。通过...

    Swift中的自动引用计数:释放内存的艺术

    在Swift编程语言中,自动引用计数(Automatic Reference Counting,简称ARC)是一种强大的内存管理机制,它极大简化了内存管理的复杂度,使开发者能够更加专注于应用程序的核心功能实现。下面我们将深入探讨Swift中...

    自动引用计数.playground.zip

    在Swift编程语言中,自动引用计数(Automatic Reference Counting,简称ARC)是内存管理的一种机制,它确保了对象的生命周期得以正确管理,避免了内存泄漏。本篇将深入探讨自动引用计数的工作原理、使用规则以及如何...

    object-C内存管理

    Objective-C使用了引用计数(Reference Counting)机制,这是其内存管理的核心。本练习主要关注如何有效地使用和理解这个机制,以及ARC(Automatic Reference Counting)的引入,它是Objective-C 2.0中的一个重要...

    C++智能指针(含内存计数)

    当引用计数降为零时,智能指针将自动调用析构函数释放对象的内存。这种机制确保了即使在复杂的数据结构和多线程环境下,也能正确地管理内存。 在实际应用中,智能指针可以用来替代原始指针,尤其是在需要动态分配...

    python内存管理机制原理详解

    Python的内存管理机制是其高效运行的关键之一,它包括了引用计数、垃圾回收和内存池等几个核心概念。下面将详细阐述这些机制的工作原理。 1. 引用计数: 引用计数是最基础的内存管理策略,它简单地记录每个对象被...

    多线程内存管理

    自动引用计数(ARC)是Apple公司在OS X Lion和iOS 5中引入的一种内存管理机制,它极大地改变了程序员管理对象内存的方式。在这份内容中,我们将详细了解ARC的背景、原理和它如何简化内存管理过程。 在Objective-...

    详细讲述在采用引用计数的内存回收方式的工作原理[定义].pdf

    引用计数是一种常见的内存管理策略,特别是在Objective-C中被广泛使用。它的核心思想是通过跟踪对象的引用次数来决定何时释放内存。当一个对象没有被任何指针引用时,即引用计数为0,系统就会回收该对象所占用的内存...

    python内存管理机制

    ### Python内存管理机制详解 #### 一、引言 Python作为一种高级动态语言,在运行时创建和销毁大量对象的过程中,内存管理扮演着至关重要的角色。它不仅直接影响到程序的执行效率,还关系到资源的合理利用。本文将...

    OC中的内存管理

    OC主要采用了两种内存管理策略:手动引用计数(MRC)和自动引用计数(ARC)。这两种机制都是为了确保在适当的时候释放不再使用的对象,从而避免内存泄漏和不必要的内存占用。 首先,我们来看手动引用计数(MRC)。...

Global site tag (gtag.js) - Google Analytics