std::shared_ptr.reset
时间: 2024-11-22 09:40:24 浏览: 14
`std::shared_ptr` 的 `reset()` 函数用于改变智能指针的行为,主要是释放它当前持有的资源并可能重新绑定到新的对象。这里有几种重载版本:
1. **void reset() noexcept;**[^1]:这会清空当前管理的对象,使`shared_ptr`变得无效(empty),不再拥有任何资源。
```cpp
// 示例
std::shared_ptr<Tmp> sptr;
sptr->value = 10; // 原始对象
sptr.reset(); // 空对象,没有指向任何资源
```
2. **template<typename Y> void reset(Y* ptr);**: 这种形式允许你显式地将`shared_ptr`绑定到一个新的对象上。
```cpp
Tmp new_value(20);
sptr.reset(&new_value); // 指向新对象,旧对象由垃圾回收机制处理
```
3. **其他重载版本**[^2]:包括带有一个或两个额外参数的版本,可以指定替换新对象时的析构函数、分配器等。这些用于更复杂的情况,如传递自定义析构函数或内存分配策略。
- 当你调用 `reset` 并传入 `nullptr` 或不传参,智能指针将不再持有任何资源,类似于删除了原对象。
- 注意,如果你直接将一个已经失效的 `shared_ptr` 绑定到新对象上,不会创建新的引用计数,而是保持原对象的引用计数不变。这意味着如果原对象的引用计数减至0,即使有新的 `shared_ptr` 指向它,也会触发其析构。
阅读全文