谈谈C++11中的智能指针std::unique_ptr和std::shared_ptr的区别和适用场景。
C++11 引入了智能指针来自动管理内存,主要包括 std::unique_ptr
和 std::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
。