MST

星途 面试题库

面试题:C++智能指针内存管理优势之中等题

简述C++中`std::unique_ptr`、`std::shared_ptr`和`std::weak_ptr`在内存管理方面的主要区别,以及各自适用于哪些场景?
24.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

std::unique_ptr

  • 内存管理区别
    • 拥有对对象的唯一所有权,同一时刻只有一个std::unique_ptr能指向给定对象。
    • std::unique_ptr被销毁(例如离开作用域),它所指向的对象会被自动释放。
    • 不能进行拷贝构造或拷贝赋值,但可以进行移动构造和移动赋值。
  • 适用场景
    • 当你希望明确某个对象只有一个所有者,并且在所有者生命周期结束时对象应该被销毁,比如管理动态分配的资源(如文件句柄、网络连接等)。
    • 作为函数返回值,高效地将对象所有权转移给调用者。

std::shared_ptr

  • 内存管理区别
    • 允许多个std::shared_ptr指向同一个对象,通过引用计数机制来管理对象的生命周期。
    • 当最后一个指向对象的std::shared_ptr被销毁时,对象才会被释放。
    • 支持拷贝构造和拷贝赋值,每次拷贝会增加引用计数,析构时减少引用计数。
  • 适用场景
    • 当多个部分的代码需要共享对同一个对象的所有权,例如在多线程环境下多个线程可能访问同一个对象。
    • 实现对象的共享,并且希望对象在所有使用者结束使用后自动销毁。

std::weak_ptr

  • 内存管理区别
    • 不拥有对象的所有权,它是对std::shared_ptr所管理对象的一种弱引用。
    • 不会影响对象的引用计数,当std::shared_ptr管理的对象被销毁,指向该对象的所有std::weak_ptr会自动变为空指针。
    • 可以通过lock()方法尝试获取一个有效的std::shared_ptr,如果对象还存在,lock()返回一个指向该对象的std::shared_ptr,否则返回空指针。
  • 适用场景
    • 用于解决std::shared_ptr循环引用问题,避免内存泄漏。例如在双向链表中,节点间使用std::weak_ptr来打破循环引用。
    • 当你需要在某些情况下访问对象,但又不想延长对象的生命周期时,比如缓存机制中,缓存项使用std::weak_ptr,当对象在其他地方被释放,缓存项能自动失效。