std::allocate_shared, std::allocate_shared_for_overwrite
在标头 <memory> 定义
|
||
template< class T, class Alloc, class... Args > shared_ptr<T> allocate_shared( const Alloc& alloc, Args&&... args ); |
(1) | (C++11 起) (T 非数组) |
template< class T, class Alloc > shared_ptr<T> allocate_shared( const Alloc& alloc, std::size_t N ); |
(2) | (C++20 起) (T 为 U[]) |
template< class T, class Alloc > shared_ptr<T> allocate_shared( const Alloc& alloc ); |
(3) | (C++20 起) (T 为 U[N]) |
template< class T, class Alloc > shared_ptr<T> allocate_shared( const Alloc& alloc, std::size_t N, |
(4) | (C++20 起) (T 为 U[]) |
template< class T, class Alloc > shared_ptr<T> allocate_shared( const Alloc& alloc, |
(5) | (C++20 起) (T 为 U[N]) |
template< class T, class Alloc > shared_ptr<T> allocate_shared_for_overwrite( const Alloc& alloc ); |
(6) | (C++20 起) (T 非 U[]) |
template< class T, class Alloc > shared_ptr<T> allocate_shared_for_overwrite( const Alloc& alloc, std::size_t N ); |
(7) | (C++20 起) (T 为 U[]) |
T
的构造函数的实参列表,构造 T
类型对象并将它包装于 std::shared_ptr。对象如同以表达式 ::new (pv) T(v) (C++20 前)std::allocator_traits<A2>::construct(a, pv, v) (C++20 起) 构造,其中 pv
是指向适合保有 T
类型对象的存储的内部 void* 指针,而 a
是重绑定到 std::remove_cv_t<T> 的分配器副本。存储通常大于 sizeof(T)
,以为共享指针的控制块和 T
对象使用一次分配。此函数所调用的 std::shared_ptr
构造函数启用了以指向新构造的 T
类型对象指针调用 shared_from_this
。所有内存分配都用 alloc 的副本执行,而它必须满足分配器 (Allocator) 的要求。此重载只有在 T 不是数组类型时才会参与重载决议。A2
类型的 a2
是重绑定为管理 std::remove_cv_t<std::remove_all_extents_t<T>> 类型对象的分配器副本。重载 (2) 创建第一维上大小为 N
的数组。数组元素以其地址递增顺序初始化,而当其生存期结束时,以原本构造顺序的逆序销毁。对于 allocate_shared
,通过表达式 std::allocator_traits<A2>::destroy(a, p) 销毁对象(或对于 (2-5) 为单独的数组元素) (C++20 起),其中 p
是指向对象的指针而 a
是传递给 allocate_shared
的分配器的副本,重绑定到正在销毁的对象类型。
对于 |
(C++20 起) |
参数
alloc | - | 使用的分配器 |
args... | - | 构造 T 实例将要用到的实参列表
|
N | - | 所用的数组大小 |
u | - | 用以初始化数组每个元素的初值 |
返回值
T
类型实例的 std::shared_ptr。
异常
能抛出从 Alloc::allocate() 抛出的异常,或从 T
构造函数抛出的异常。若抛出异常,则 (1) 无效果。若异常在数组的构造中抛出,则已初始化元素以逆序销毁。 (C++20 起)
注解
类似 std::make_shared,此函数通常只进行一次分配,并将 T
对象与控制块都置于分配的内存块中(标准推荐但不要求如此,所有已知实现均如此)。alloc 的一个副本作为控制块的一部分存储,从而当所有共享及若引用计数抵达零时能用于它的解分配。
不同于 std::shared_ptr
构造函数
,std::allocate_shared
不接受另外的自定义删除器:它用提供的分配器来进行控制块和 T
对象的析构,及其共享内存块的解分配。
std::shared_ptr 支持数组类型(从 C++17 起),但 |
(C++20 前) |
构造函数以 U*
类型指针 ptr
启用 shared_from_this
,表示它确定 U
是否拥有作为 std::enable_shared_from_this 特化的无歧义且可访问 (C++17 起)基类,而若如此,则构造函数求值语句:
if (ptr != nullptr && ptr->weak_this.expired()) ptr->weak_this = std::shared_ptr<std::remove_cv_t<U>>( *this, const_cast<std::remove_cv_t<U>*>(ptr));
其中 weak_this
是 std::shared_from_this 的隐藏 mutable std::weak_ptr 成员。对 weak_this
成员的赋值不是原子的,且与任何到同一对象的潜在并发访问冲突。这确保将来对 shared_from_this() 的调用,将与此裸指针构造函数所创建的 shared_ptr
共享所有权。
上述解释代码中,测试 ptr->weak_this.expired()
是为确保当 weak_this
指示已有所有者时无须对它重赋值。从 C++17 起要求此测试。
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__cpp_lib_smart_ptr_for_overwrite |
202002L | (C++20) | 进行默认初始化的智能指针创建(std::allocate_shared_for_overwrite , std::make_shared_for_overwrite, std::make_unique_for_overwrite);重载 (6,7)
|
参阅
构造新的 shared_ptr (公开成员函数) | |
创建管理一个新对象的共享指针 (函数模板) |