c++11 智能指针的用法
时间: 2024-08-28 10:02:35 浏览: 49
C++11 引入了智能指针的概念,目的是为了简化动态内存管理,避免内存泄漏等问题。智能指针是一种资源管理类,它们将“获得资源必须释放”的责任通过类的机制来确保。C++11提供了几种智能指针,其中最常用的是`std::unique_ptr`, `std::shared_ptr`和`std::weak_ptr`。
1. `std::unique_ptr`:拥有它指向的对象,当`unique_ptr`被销毁时,它指向的对象也会被销毁。这种智能指针不允许拷贝构造和拷贝赋值,但可以移动构造和移动赋值。
使用示例:
```cpp
#include <memory>
void foo() {
std::unique_ptr<int> ptr(new int(10)); // 创建一个unique_ptr
*ptr = 20; // 操作指向的对象
} // foo()结束时,ptr销毁,指向的int也被删除
```
2. `std::shared_ptr`:允许多个指针共同拥有同一个对象,通过引用计数的方式来管理对象的生命周期。当最后一个`shared_ptr`被销毁时,它指向的对象也会被销毁。
使用示例:
```cpp
#include <memory>
void foo() {
std::shared_ptr<int> ptr1(new int(10)); // 创建一个shared_ptr
std::shared_ptr<int> ptr2 = ptr1; // 另一个shared_ptr指向相同对象
} // foo()结束时,ptr1和ptr2都被销毁,指向的int被删除
```
3. `std::weak_ptr`:不拥有对象,与`shared_ptr`一起使用,主要用于解决`shared_ptr`的循环引用问题。`weak_ptr`不会增加引用计数,可以通过`lock`方法尝试提升为`shared_ptr`。
使用示例:
```cpp
#include <memory>
void foo() {
std::shared_ptr<int> shared(new int(10));
std::weak_ptr<int> weak = shared;
// 可能有其他代码会销毁shared_ptr
// ...
if (auto ptr = weak.lock()) {
// weak.lock()成功,此时ptr是一个shared_ptr
*ptr = 20; // 操作指向的对象
} else {
// 对象已被销毁
}
}
```
使用智能指针时需要注意:
- 不要使用原始指针来初始化多个智能指针。
- 不要混合使用智能指针和原始指针进行内存释放。
- 对于`shared_ptr`,确保不会出现循环引用导致的内存泄漏。
- 确保在智能指针有效期内,不会发生悬空引用的情况。
阅读全文