Skip to content

Latest commit

 

History

History
59 lines (46 loc) · 2.1 KB

智能指针.md

File metadata and controls

59 lines (46 loc) · 2.1 KB

智能指针

智能指针(Smart Pointer)是C++标准库中的一种模板类,用于自动管理动态分配的内存,以避免内存泄漏和悬挂指针等问题。智能指针通过RAII(Resource Acquisition Is Initialization)机制,在对象生命周期结束时自动释放资源。C++11标准引入了三种主要的智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr

std::unique_ptr

  • 特点:独占所有权,不能复制,只能移动。
  • 用途:适用于一个对象只能有一个所有者的场景。
  • 示例
    #include <memory>
    
    std::unique_ptr<int> ptr1(new int(10));
    std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1 失去所有权,ptr2 获得所有权

std::shared_ptr

  • 特点:共享所有权,可以复制,使用引用计数来管理资源。
  • 用途:适用于多个对象共享同一资源的场景。
  • 示例
    #include <memory>
    
    std::shared_ptr<int> ptr1(new int(10));
    std::shared_ptr<int> ptr2 = ptr1; // ptr1 和 ptr2 共享所有权

std::weak_ptr

  • 特点:弱引用,不影响引用计数,防止循环引用。

  • 用途:通常与std::shared_ptr配合使用,用于解决循环引用问题。

  • 示例

    #include <iostream>
    #include <memory>
    
    class Node {
    public:
        std::shared_ptr<Node> next;
        std::weak_ptr<Node> prev; // 使用 weak_ptr 打破循环引用
    
        ~Node() {
            std::cout << "Node destroyed" << std::endl;
        }
    };
    
    int main() {
        auto node1 = std::make_shared<Node>();
        auto node2 = std::make_shared<Node>();
    
        node1->next = node2;
        node2->prev = node1; // 使用 weak_ptr
    
        return 0;
    }

    在这个例子中,node1node2 互相引用,但由于 prev 使用的是 std::weak_ptr,不会增加引用计数,从而避免了循环引用。

总结

智能指针通过自动管理内存的分配和释放,极大地减少了手动管理内存带来的复杂性和错误。选择合适的智能指针类型可以提高代码的安全性和可维护性。