谈谈C++11中的智能指针std::unique_ptr和std::shared_ptr的区别和适用场景。

C++11 引入了智能指针来自动管理内存,主要包括 std::unique_ptrstd::shared_ptr。这两种智能指针各有特点,适用于不同的场景。

std::unique_ptr

  • 特点std::unique_ptr 是一种独占式智能指针,它保证同一时间只有一个指针拥有对对象的所有权。当 std::unique_ptr 被销毁时,它所指向的对象也会被自动删除。
  • 适用场景
    • 用于管理资源的独占访问。
    • 实现资源所有权的转移,例如从函数返回动态分配的对象。
    • 用于实现 RAII (Resource Acquisition Is Initialization) 模式,确保资源在任何情况下都能被正确释放。

std::shared_ptr

  • 特点std::shared_ptr 是一种共享式智能指针,它允许多个指针共享对同一个对象的所有权。std::shared_ptr 使用引用计数机制来跟踪有多少个指针共享同一个资源,当最后一个 std::shared_ptr 被销毁时,资源会被自动释放。
  • 适用场景
    • 用于实现共享所有权的资源管理,如共享数据或缓存。
    • 用于实现循环引用的数据结构,如图或双向链表(需配合 std::weak_ptr 使用以避免内存泄漏)。
    • 用于实现 observer 模式,观察者使用 std::shared_ptr 来共享对被观察对象的访问。

示例代码

#include <iostream>
#include <memory>

void processResource(std::shared_ptr<int> ptr) {
    std::cout << "Processing resource: " << *ptr << std::endl;
}

int main() {
    std::unique_ptr<int> uptr(new int(10)); // 独占资源
    // std::unique_ptr<int> uptr2 = uptr; // 错误:不能复制 std::unique_ptr

    std::shared_ptr<int> sptr(new int(20)); // 共享资源
    std::shared_ptr<int> sptr2 = sptr; // 正确:可以复制 std::shared_ptr

    processResource(sptr2); // 多个指针可以共享同一个资源

    return 0;
}

总结

  • std::unique_ptr 适用于资源的独占管理,它是轻量级的,开销较小。
  • std::shared_ptr 适用于资源的共享管理,它使用引用计数机制,开销相对较大。
  • 在选择智能指针时,应根据资源的所有权和生命周期需求来决定使用 std::unique_ptr 还是 std::shared_ptr

发表评论

后才能评论