面试题答案
一键面试std::unique_ptr
- 特点:
- 独占式拥有资源,同一时间只有一个
std::unique_ptr
可以指向给定对象。 - 资源所有权转移时高效,移动构造和移动赋值操作代价低。
- 不能进行拷贝构造和拷贝赋值,只能进行移动操作。
- 独占式拥有资源,同一时间只有一个
- 适用场景:
- 当你希望对某个对象拥有绝对控制权,确保对象在其生命周期内只有一个所有者时使用。例如,管理动态分配的数组,
std::unique_ptr<int[]>
。 - 函数返回动态分配的对象时,使用
std::unique_ptr
可以高效地转移所有权。
- 当你希望对某个对象拥有绝对控制权,确保对象在其生命周期内只有一个所有者时使用。例如,管理动态分配的数组,
- 与其他智能指针区别:
- 与
std::shared_ptr
相比,std::unique_ptr
不支持共享所有权,没有引用计数开销,更轻量级。 - 与
std::weak_ptr
相比,std::unique_ptr
是强引用,直接控制对象生命周期,而std::weak_ptr
是弱引用,不控制对象生命周期。
- 与
std::shared_ptr
- 特点:
- 共享式拥有资源,通过引用计数来管理对象的生命周期。
- 支持拷贝构造和拷贝赋值,多个
std::shared_ptr
可以指向同一个对象,引用计数增加;当std::shared_ptr
析构时,引用计数减少。 - 当引用计数为 0 时,自动释放所指向的对象。
- 适用场景:
- 当多个对象需要共享同一个资源的所有权时使用,比如在多个模块之间共享一个数据结构。
- 适用于无法确定对象生命周期结束的场景,由引用计数自动管理。
- 与其他智能指针区别:
- 与
std::unique_ptr
相比,std::shared_ptr
支持共享所有权,但存在引用计数开销,性能上略低于std::unique_ptr
。 - 与
std::weak_ptr
相比,std::shared_ptr
是强引用,会增加对象的引用计数从而延长对象生命周期,而std::weak_ptr
是弱引用,不会影响对象生命周期。
- 与
std::weak_ptr
- 特点:
- 弱引用,不控制对象的生命周期,不增加对象的引用计数。
- 用于解决
std::shared_ptr
的循环引用问题。 - 可以通过
lock()
方法尝试获取一个std::shared_ptr
,如果对象已被释放,则lock()
返回空指针。
- 适用场景:
- 当需要观察
std::shared_ptr
所管理对象,但又不想影响其生命周期时使用,例如实现观察者模式。 - 用于打破
std::shared_ptr
之间的循环引用,避免内存泄漏。
- 当需要观察
- 与其他智能指针区别:
- 与
std::unique_ptr
和std::shared_ptr
相比,std::weak_ptr
不直接控制对象生命周期,是一种辅助性的智能指针,用于解决特定场景下的问题,如循环引用。
- 与