面试题答案
一键面试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
,当对象在其他地方被释放,缓存项能自动失效。
- 用于解决