shared_ptr根本就没有第二个模板参数啊,shared_ptr<T, Deleter>中的Deleter是哪来的啊
时间: 2023-10-17 17:14:24 浏览: 72
非常抱歉,我的回答有误。是这样的,`std::shared_ptr` 的确只有一个模板参数 `T`,但是它可以通过第二个构造函数参数 `Deleter` 来指定删除器,这个删除器类型默认为 `std::default_delete`,可以自定义。在使用时,需要将删除器类型作为共享指针的第二个模板参数进行传递。例如:
```cpp
// 使用默认的删除器
std::shared_ptr<int> p1(new int(10));
// 使用自定义的删除器
auto deleter = [](int* p) { std::cout << "delete " << *p << std::endl; delete p; };
std::shared_ptr<int> p2(new int(20), deleter);
```
在上面的例子中,`p1` 使用了默认的删除器,而 `p2` 使用了自定义的删除器。
相关问题
unique_ptr<T[]> 有哪些操作?
unique_ptr<T[]> 是一个指向 T 类型数组的智能指针,它可以通过以下操作来管理动态分配的内存:
1. 构造函数:unique_ptr<T[]> 可以使用默认构造函数、指定指针的构造函数、传入 deleter 的构造函数、传入自定义删除器的构造函数等多种方式进行构造。
2. 赋值操作:可以用 unique_ptr<T[]> 对象给另一个 unique_ptr<T[]> 对象赋值,也可以用 nullptr 或者已存在的指针来赋值。
3. 解引用操作:unique_ptr<T[]> 支持解引用操作,可以通过 * 和 [] 运算符访问数组元素。
4. 释放内存: unique_ptr<T[]> 会自动管理内存,当它被销毁时,它所指向的数组内存会被自动释放。
5. 移动和交换:unique_ptr<T[]> 支持移动语义和 swap() 函数,可以在不复制内存的情况下将指针所有权转移或交换。
6. 获取指针:可以使用 get() 函数获取智能指针所指向的数组的原始指针。
7. 重置指针:可以使用 reset() 函数将智能指针指向另一个数组或者置为 nullptr。
8. 检查指针是否为空:可以使用 operator bool() 函数或者 ! 操作符检查智能指针是否为空。
9. 获取数组大小:可以使用 size() 函数获取数组的大小。
shared_ptr和unique_ptr的使用场景
shared_ptr和unique_ptr是C++11中引入的智能指针类型,用于管理动态分配的资源。它们的使用场景如下:
1. shared_ptr的使用场景:
- 在存在多个指针需要共享同一个资源的情况下,使用shared_ptr可以确保资源不会被提前释放。
- 在需要跨函数或跨对象传递指针,并且需要自动释放资源的情况下,也可以使用shared_ptr。
2. unique_ptr的使用场景:
- 在需要独占一个资源的情况下,使用unique_ptr可以确保资源不会被多个指针共享。
- 在需要将指针转移所有权的情况下,unique_ptr是一个很好的选择。
- 在需要使用自定义删除器(custom deleter)的情况下,unique_ptr提供了更灵活的方式。
阅读全文