定义于头文件
template< class T > class shared_ptr; (C++11 起)
std::get_deleter
- template< class Deleter, class T >
- Deleter* get_deleter( const std::shared_ptr<T>& p ) noexcept; (C++11 起)
访问 p 的删除器。若共享指针 p 占有无 cv 限定 Deleter 类型的删除器(例如,若它以接收删除器为参数的构造函数之一创建),则返回指向删除器的指针。否则,返回空指针。
| p | - | 需要访问其删除器的共享指针 |
指向被占有删除器的指针或 nullptr 。只要至少还有一个 shared_ptr 实例占有返回的指针,它就合法。
返回的指针可能比最后一个 shared_ptr 的生存期更持久,例如,还剩下 std::weak_ptr 时且实现在销毁整个控制块前不销毁删除器。
- #include <iostream>
- #include <memory>
-
- struct Foo
- {
- int i;
- };
- void foo_deleter(Foo * p)
- {
- std::cout << "foo_deleter called!\n";
- delete p;
- }
-
- int main()
- {
- std::shared_ptr<int> aptr;
-
- {
- // 创建拥有一个 Foo 和删除器的 shared_ptr
- auto foo_p = new Foo;
- std::shared_ptr<Foo> r(foo_p, foo_deleter);
- aptr = std::shared_ptr<int>(r, &r->i); // 别名使用构造函数
- // aptr 现在指向 int ,但管理整个 Foo
- } // r 被销毁(不调用删除器)
-
- // 获得指向删除器的指针:
- if (auto del_p = std::get_deleter<void(*)(Foo*)>(aptr))
- {
- std::cout << "shared_ptr
owns a deleter\n" ; - if (*del_p == foo_deleter)
- {
- std::cout << "...and it equals &foo_deleter\n";
- }
- }
- else
- {
- std::cout << "The deleter of shared_ptr
is null!\n" ; - }
- } // 于此调用删除器

std::shared_ptr<T>::operator==, !=, <, <=, >, >=
| template < class T, class U > | (1) | (C++11 起) |
| template< class T, class U > | (2) | (C++11 起) |
| template< class T, class U > | (3) | (C++11 起) |
| template< class T, class U > | (4) | (C++11 起) |
| template< class T, class U > | (5) | (C++11 起) |
| template< class T, class U > | (6) | (C++11 起) |
| template< class T > | (7) | (C++11 起) |
| template< class T > | (8) | (C++11 起) |
| template< class T > | (9) | (C++11 起) |
| template< class T > | (10) | (C++11 起) |
| template< class T > | (11) | (C++11 起) |
| template< class T > | (12) | (C++11 起) |
| template< class T > | (13) | (C++11 起) |
| template< class T > | (14) | (C++11 起) |
| template< class T > | (15) | (C++11 起) |
| template< class T > | (16) | (C++11 起) |
| template< class T > | (17) | (C++11 起) |
| template< class T > | (18) | (C++11 起) |
比较二个 shared_ptr 对象或将 shared_ptr 与空指针比较。
注意 shared_ptr 的比较运算符简单地比较指针值;不比较所指向的实际对象。对 shared_ptr 定义 operator< 允许将 shared_ptr 用作关联容器,如 std::map 与 std::set 中的关键。
| lhs | - | 要比较的左侧 shared_ptr |
| rhs | - | 要比较的右侧 shared_ptr |
1) lhs.get() == rhs.get()
2) !(lhs == rhs)
3) std::less
4) rhs < lhs
5) !(rhs < lhs)
6) !(lhs < rhs)
7) !lhs
8) !rhs
9) (bool)lhs
10) (bool)rhs
11) std::less
12) std::less
13) nullptr < lhs
14) rhs < nullptr
15) !(nullptr < lhs)
16) !(rhs < nullptr)
17) !(lhs < nullptr)
18) !(nullptr < rhs)
所有情况下,被比较者是存储的指针( get() 所返回者)而非被管理指针( uses_count 达到零时传递给删除器者)。二个指针可能在用别名使用构造函数创建的 shared_ptr 中不同。
std::shared_ptr<T>::operator<<
- template <class T, class U, class V>
- std::basic_ostream<U, V>& operator<<
- (std::basic_ostream<U, V>& os, const std::shared_ptr<T>& ptr);
插入存储于 ptr 的指针值到输出流 os 中。
等价于 os << ptr.get() 。
| os | - | 要插入 ptr 到的 std::basic_ostream |
| ptr | - | 被插入到 os 的数据 |
os
调用示例- #include <iostream>
- #include <memory>
-
- class Foo {};
-
- int main()
- {
- auto sp = std::make_shared<Foo>();
- std::cout << sp << std::endl;
- std::cout << sp.get() << std::endl;
- }

std::swap(std::shared_ptr)
- template< class T >
- void swap( shared_ptr<T>& lhs, shared_ptr<T>& rhs ) noexcept;(C++11 起)
为 std::shared_ptr 特化 std::swap 算法。交换 lhs 与 rhs 的指针。调用 lhs.swap(rhs) 。
| lhs, rhs | - | 要交换内容的智能指针 |
(无)
常数
std::hash(std::shared_ptr)
template<class T> struct hash<shared_ptr<T>>; (C++11 起)
std::hash 对 std::shared_ptr
对于给定的 std::shared_ptr
| std::hash | (C++17 前) |
| std::hash | (C++17 起) |