cpp11std::unique_ptr 和 std::shared_ptr
时间: 2023-05-30 07:04:50 浏览: 204
cpp11std::unique_ptr和std::shared_ptr都是C++11标准库中智能指针的实现。它们都可以自动管理动态分配的内存,并避免内存泄漏的问题。
cpp11std::unique_ptr是一种独占式智能指针,它拥有对动态分配内存的独占权,只能由一个cpp11std::unique_ptr对象管理。当cpp11std::unique_ptr对象被销毁时,它所管理的动态分配内存也会被自动释放。
std::shared_ptr是一种共享式智能指针,它可以被多个std::shared_ptr对象共享。当最后一个std::shared_ptr对象被销毁时,它所管理的动态分配内存也会被自动释放。std::shared_ptr通过引用计数来实现动态内存管理,每个std::shared_ptr对象都维护着一个引用计数器,记录有多少个std::shared_ptr对象共享同一个动态分配内存。
使用cpp11std::unique_ptr和std::shared_ptr可以避免手动管理动态内存的麻烦和风险,提高程序的可靠性和安全性。但需要注意的是,std::shared_ptr的引用计数机制可能会导致循环引用的问题,这时需要使用std::weak_ptr来解决。
相关问题
std::unique_ptr和std::shared_ptr怎么使用
`std::unique_ptr` 和 `std::shared_ptr` 是C++11标准库中提供的两个智能指针,用于替代原始的指针,以简化内存管理并防止资源泄露。它们分别代表独占所有权(exclusive ownership)和共享所有权(shared ownership)的概念。
### 1. std::unique_ptr
- **独占所有权**:`std::unique_ptr` 指向的对象有且仅有一个拥有者,当拥有者离开作用域时,它会自动调用析构函数释放内存。
- **创建和使用**:
```cpp
std::unique_ptr<int> ptr(new int(5)); // 创建并初始化一个整型对象
ptr = nullptr; // 移除所有权,对象会被销毁
```
- **优点**:
- 避免了忘记删除动态分配的内存的风险。
- 单线程场景中性能较好,因为没有额外的引用计数。
### 2. std::shared_ptr
- **共享所有权**:`std::shared_ptr` 可以有多个所有者,每个所有者都有权调用析构函数。内部维护一个引用计数,当最后一个所有者消失时,才会释放内存。
- **创建和使用**:
```cpp
std::shared_ptr<int> ptr1(new int(5)), ptr2(ptr1); // 创建共享所有权
ptr1.reset(); // 将ptr1的所有权转移给NULL,但仍保留ptr2的引用
```
- **优点**:
- 支持多线程环境下的安全共享。
- 自动垃圾回收,适合于大量对象的生命周期不确定的情况。
阅读全文