引用计数怎么实现,在哪里?

引用计数(Reference Counting)是一种内存管理技术,它主要用于跟踪对象被引用的次数。

在引用计数中,每个对象都有一个计数器,记录着当前对象被引用的次数。

当对象被引用时,计数器加1;当引用失效时,计数器减1。

当计数器为零时,表示没有任何引用,可以安全地释放对象。

图片[1]-引用计数怎么实现,在哪里?-不念博客

在C++中,引用计数通常通过智能指针实现,特别是std::shared_ptr。

std::shared_ptr 使用引用计数来跟踪共享的对象。

计数器存储在一个控制块(control block)中,这个控制块同时还包含了指向实际对象的指针。

给个例子,展示如何使用 std::shared_ptr 实现引用计数:

#include <memory>
#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "Object created." << std::endl;
    }

    ~MyClass() {
        std::cout << "Object destroyed." << std::endl;
    }
};

int main() {
    std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>();
    std::shared_ptr<MyClass> ptr2 = ptr1;

    std::cout << "Use count: " << ptr1.use_count() << std::endl;

    // ptr2 被销毁后,计数器减1
    ptr2.reset();

    std::cout << "Use count: " << ptr1.use_count() << std::endl;

    // ptr1 被销毁后,计数器减1,为零时,MyClass 对象被销毁
    ptr1.reset();

    return 0;
}

在这个例子中,std::shared_ptr 内部维护了一个引用计数,通过 use_count 方法可以获取当前的引用计数。

在 ptr2.reset() 后,ptr2 被销毁,引用计数减1。

在 ptr1.reset() 后,ptr1 被销毁,引用计数再次减1,因为此时引用计数为零,MyClass 对象会被销毁。

© 版权声明
THE END