您现在的位置是:首页 >技术杂谈 >【C++八股】智能指针网站首页技术杂谈

【C++八股】智能指针

KK虫 2026-06-27 00:01:04
简介【C++八股】智能指针
智能指针⽤于管理动态内存的对象,其主要⽬的是在避免内存泄漏和多次释放资源。

1. std::unique_ptr 独占智能指针

std::unique_ptr 是一种独立智能指针,独占内存资源,不能被其他独立智能指针共享,拥有自动释放内存的功能。

std::unique_ptr 拥有对某个对象的控制权。当 std::unique_ptr 被销毁时,它所管理的对象也会被自动销毁,从而有效防止内存泄漏。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed
"; }
    ~MyClass() { std::cout << "MyClass destructed
"; }
    void doSomething() { std::cout << "Doing something
"; }
};

int main() {
    // 创建 std::unique_ptr
    std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();

    // 使用 -> 访问成员
    ptr1->doSomething();

    // 无法复制 std::unique_ptr
    // std::unique_ptr<MyClass> ptr2 = ptr1; // 编译错误

    // 可以移动 std::unique_ptr
    std::unique_ptr<MyClass> ptr2 = std::move(ptr1);

    // ptr1 现在为空
    if (ptr1 == nullptr) {
        std::cout << "ptr1 is null
";
    }

    // ptr2 现在拥有对象
    ptr2->doSomething();

    // 离开作用域时,ptr2 自动删除对象
}

2.std::shared_ptr (共享智能指针)

shared_ptr 旨在管理动态分配对象的生命周期,支持多个指针共享同一对象的所有权。它通过引用计数机制来追踪有多少个 std::shared_ptr 实例指向同一个对象,当引用计数降为零时,自动释放所管理的对象,从而有效防止内存泄漏。

主要特性:

  • 共享所有权: 多个 std::shared_ptr 实例可以指向同一个对象,共享对该对象的所有权。每次拷贝或赋值都会增加引用计数,每次析构都会减少引用计数。当引用计数为零时,自动删除所指向的对象。

  • 线程安全: std::shared_ptr 的引用计数是线程安全的,可以在多个线程中安全地拷贝和销毁。但需要注意,对同一对象的操作仍需使用适当的同步机制。

  • 内存管理: std::shared_ptr 内部维护一个控制块,包含引用计数和删除器等信息。使用 std::make_shared 创建 std::shared_ptr 时,会同时分配对象和控制块的内存,避免了多次内存分配,提高了性能。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() { std::cout << "MyClass constructed
"; }
    ~MyClass() { std::cout << "MyClass destructed
"; }
    void doSomething() { std::cout << "Doing something
"; }
};

int main() {
    // 使用 std::make_shared 创建 std::shared_ptr
    auto ptr1 = std::make_shared<MyClass>();

    // 使用 -> 访问成员
    ptr1->doSomething();

    // 拷贝构造,引用计数增加
    auto ptr2 = ptr1;
    std::cout << "Reference count: " << ptr1.use_count() << "
"; // 输出 2

    // 赋值构造,引用计数增加
    auto ptr3 = ptr2;
    std::cout << "Reference count: " << ptr1.use_count() << "
"; // 输出 3

    // 离开作用域时,ptr1、ptr2 和 ptr3 会被销毁,引用计数减少
    // 当引用计数为 0 时,自动释放 MyClass 对象
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。