引用计数(Reference Counting)是一种内存管理技术,它主要用于跟踪对象被引用的次数。
在引用计数中,每个对象都有一个计数器,记录着当前对象被引用的次数。
当对象被引用时,计数器加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