21xrx.com
2024-11-05 19:37:24 Tuesday
登录
文章检索 我的文章 写文章
C++智能指针的引用计数
2023-07-05 09:21:45 深夜i     --     --
C++ 智能指针 引用计数

在C++中,指针是一种广泛使用的数据类型,但是它们也经常导致内存泄漏和悬挂指针等风险。为了解决这些问题,C++11引入了智能指针,其中最常见的是使用引用计数来管理指针的所有权。

智能指针的引用计数工作原理如下:每当一个智能指针被创建时,其所引用对象的引用计数加1;每当一个指向该对象的智能指针被销毁时,其所引用对象的引用计数减1。当引用计数为0时,该对象被销毁,这意味着该对象不再被任何智能指针持有。智能指针的引用计数通常使用std::shared_ptr来实现。

下面是一个示例:


#include <memory>

#include <iostream>

int main()

{

  std::shared_ptr<int> p1 = std::make_shared<int>(42);

  std::shared_ptr<int> p2 = p1;

  std::shared_ptr<int> p3 = p2;

  

  std::cout << "p1 use count: " << p1.use_count() << std::endl;

  std::cout << "p2 use count: " << p2.use_count() << std::endl;

  std::cout << "p3 use count: " << p3.use_count() << std::endl;

  

  p1.reset();

  std::cout << "p1 reseted" << std::endl;

  

  std::cout << "p1 use count: " << p1.use_count() << std::endl;

  std::cout << "p2 use count: " << p2.use_count() << std::endl;

  std::cout << "p3 use count: " << p3.use_count() << std::endl;

  

  p2.reset();

  std::cout << "p2 reseted" << std::endl;

  

  std::cout << "p1 use count: " << p1.use_count() << std::endl;

  std::cout << "p2 use count: " << p2.use_count() << std::endl;

  std::cout << "p3 use count: " << p3.use_count() << std::endl;

  return 0;

}

输出结果:


p1 use count: 3

p2 use count: 3

p3 use count: 3

p1 reseted

p1 use count: 0

p2 use count: 2

p3 use count: 2

p2 reseted

p1 use count: 0

p2 use count: 0

p3 use count: 1

从输出可以看出,三个智能指针指向的同一个对象,其引用计数一直为3,每当一个指针被销毁时,引用计数就减1。当p1和p2被reset后,对象的引用计数为0,因此对象被销毁。

引用计数的工作原理非常简单,但是它也存在一些小问题。例如,当两个智能指针相互引用时,它们可能会导致循环引用,使得对象永远无法被销毁。为了解决这个问题,可以使用std::weak_ptr来打破引用循环,它不会影响引用计数,但也可以检查对象是否已被销毁。

总的来说,智能指针的引用计数是C++中常用的内存管理方式之一,它可以有效地避免内存泄漏和悬挂指针等问题,但也需要注意潜在的循环引用问题。在实际开发中,需要根据具体的场景选择适合的内存管理方式。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复