自学内容网 自学内容网

C++智能指针

  1. 智能指针的定义
    • 在 C++ 中,智能指针是一种类模板,用于管理动态分配的内存。它的主要目的是自动管理所指向对象的生命周期,避免手动释放内存可能导致的内存泄漏(如忘记释放内存)和悬空指针(如释放内存后继续使用指针)等问题。智能指针在对象不再被使用时自动释放其所指向的内存,就像有一个 “智能的管家” 在管理内存资源。
  1. 智能指针的类型
    • std::unique_ptr
      • 独占所有权:std::unique_ptr是一种独占式智能指针。它所指向的对象只能有一个unique_ptr拥有。这意味着当一个unique_ptr拥有一个对象时,其他unique_ptr不能同时拥有该对象。资源转移语义:它支持资源的转移。可以通过std::move函数将一个unique_ptr所拥有的资源转移到另一个unique_ptr中。
      • 应用场景:当对象的所有权在程序的某个部分明确是独占性的,如在一个函数内部创建一个对象,并且该对象只在这个函数内部使用,当函数结束时对象应该被销毁,unique_ptr就很合适。例如,一个函数创建一个动态分配的文件句柄对象,函数结束时文件句柄应该被自动关闭,就可以用unique_ptr来管理。
  • std::shared_ptr
    • 共享所有权:std::shared_ptr实现了共享式的所有权。多个shared_ptr可以同时指向同一个对象,并且会对这个对象的引用计数进行维护。当最后一个指向该对象的shared_ptr被销毁或者重置时,对象才会被释放。
  • 引用计数机制:在内部,shared_ptr有一个引用计数的变量。每当一个新的shared_ptr指向同一个对象时,引用计数就加 1;当一个shared_ptr被销毁或者不再指向该对象时(如通过reset函数),引用计数就减 1。当引用计数变为 0 时,shared_ptr所指向的对象就会被自动删除。例如:

std::shared_ptr<int> ptr1 = std::make_shared<int>(5);
{
    std::shared_ptr<int> ptr2 = ptr1;
    // 此时对象的引用计数为2
}
// 离开作用域后,ptr2被销毁,引用计数变为1

  • 应用场景:适用于多个对象需要共享同一个资源的情况。比如在一个复杂的数据结构中,多个节点可能需要共享同一个数据块,这时候就可以使用shared_ptr来管理这个数据块的内存。
  • std::weak_ptr
    • 弱引用关系:std::weak_ptr是一种弱引用智能指针,它不会增加所指向对象的引用计数。它主要用于解决shared_ptr循环引用的问题。例如,在一个双向链表结构中,如果两个节点通过shared_ptr相互引用,会导致引用计数永远不为 0,从而造成内存泄漏。
    • 配合shared_ptr使用:weak_ptr通常是从shared_ptr创建而来,并且可以通过lock函数来尝试获取一个有效的shared_ptr。如果所指向的对象还存在(即引用计数大于 0),lock函数会返回一个指向该对象的shared_ptr,否则返回一个空的shared_ptr。例如:

std::shared_ptr<int> ptr1 = std::make_shared<int>(5);
std::weak_ptr<int> ptr2 = ptr1;
if (auto sharedPtr = ptr2.lock()) {
    // 可以通过sharedPtr访问对象
} else {
    // 对象已经被销毁
}

  • 应用场景:在需要观察一个对象但又不想影响其生命周期的情况下使用。比如在对象缓存系统中,缓存可以用weak_ptr来保存对对象的引用,当对象在其他地方被销毁时,缓存中的weak_ptr不会阻止对象的释放。

原文地址:https://blog.csdn.net/2302_81041084/article/details/143983329

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!