定义于头文件
template< class T > class shared_ptr; (C++11 起)
std::get_deleter
template< class Deleter, class T >
Deleter* get_deleter( const std::shared_ptr& p ) noexcept; (C++11 起)
访问 p
的删除器。若共享指针 p
占有无 cv 限定 Deleter
类型的删除器(例如,若它以接收删除器为参数的构造函数之一创建),则返回指向删除器的指针。否则,返回空指针。
p | - | 需要访问其删除器的共享指针 |
指向被占有删除器的指针或 nullptr
。只要至少还有一个 shared_ptr
实例占有返回的指针,它就合法。
返回的指针可能比最后一个 shared_ptr
的生存期更持久,例如,还剩下 std::weak_ptr 时且实现在销毁整个控制块前不销毁删除器。
#include
#include
struct Foo
{
int i;
};
void foo_deleter(Foo * p)
{
std::cout << "foo_deleter called!\n";
delete p;
}
int main()
{
std::shared_ptr aptr;
{
// 创建拥有一个 Foo 和删除器的 shared_ptr
auto foo_p = new Foo;
std::shared_ptr r(foo_p, foo_deleter);
aptr = std::shared_ptr(r, &r->i); // 别名使用构造函数
// aptr 现在指向 int ,但管理整个 Foo
} // r 被销毁(不调用删除器)
// 获得指向删除器的指针:
if (auto del_p = std::get_deleter(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::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::operator<<
template
std::basic_ostream& operator<<
(std::basic_ostream& os, const std::shared_ptr& ptr);
插入存储于 ptr 的指针值到输出流 os 中。
等价于 os << ptr.get()
。
os | - | 要插入 ptr 到的 std::basic_ostream |
ptr | - | 被插入到 os 的数据 |
os
调用示例
#include
#include
class Foo {};
int main()
{
auto sp = std::make_shared();
std::cout << sp << std::endl;
std::cout << sp.get() << std::endl;
}
std::swap(std::shared_ptr)
template< class T >
void swap( shared_ptr& lhs, shared_ptr& rhs ) noexcept;(C++11 起)
为 std::shared_ptr 特化 std::swap 算法。交换 lhs
与 rhs
的指针。调用 lhs.swap(rhs) 。
lhs, rhs | - | 要交换内容的智能指针 |
(无)
常数
std::hash(std::shared_ptr)
template struct hash>; (C++11 起)
std::hash 对 std::shared_ptr
对于给定的 std::shared_ptr
std::hash |
(C++17 前) |
std::hash |
(C++17 起) |