C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- std::unique_ptr
- std::make_unique, std::make_unique_for_overwrite
- std::hash <std::unique_ptr>
- std::unique_ptr<T,Deleter>::operator<<
- std::swap(std::unique_ptr)
- std::unique_ptr<T,Deleter>::operator*
- std::unique_ptr<T,Deleter>::operator[]
- operator==,!=,<,<=,>,>=,<=>(std::unique_ptr)
- std::unique_ptr<T,Deleter>::get
- std::unique_ptr<T,Deleter>::get_deleter
- std::unique_ptr<T,Deleter>::operator bool
- std::unique_ptr<T,Deleter>::reset
- std::unique_ptr<T,Deleter>::swap
- std::unique_ptr<T,Deleter>::operator=
- std::unique_ptr<T,Deleter>::release
- std::unique_ptr<T,Deleter>::unique_ptr
- std::unique_ptr<T,Deleter>::~unique_ptr
- std::addressof
- std::allocator_traits
- std::default_delete
- std::allocator_arg_t
- std::allocator_arg
- std::weak_ptr
- std::enable_shared_from_this
- std::bad_weak_ptr
- std::scoped_allocator_adaptor
- std::auto_ptr
- std::destroy_at
- std::destroy
- std::destroy_n
- std::uninitialized_move
- std::uninitialized_value_construct
- std::owner_less
- std::shared_ptr
- std::to_address
- std::assume_aligned
- std::make_obj_using_allocator
- C 内存管理库
- 低层内存管理
- std::pmr::memory_resource
- std::allocator
- std::pointer_traits
- std::uses_allocator
- std::uses_allocator_construction_args
- std::uninitialized_construct_using_allocator
- std::pmr::polymorphic_allocator
- std::pmr::get_default_resource
- std::pmr::set_default_resource
- std::pmr::new_delete_resource
- std::pmr::null_memory_resource
- std::pmr::synchronized_pool_resource
- std::pmr::unsynchronized_pool_resource
- std::pmr::monotonic_buffer_resource
- std::pmr::pool_options
- std::raw_storage_iterator
- std::get_temporary_buffer
- std::return_temporary_buffer
- std::uninitialized_copy
- std::uninitialized_fill
- std::uninitialized_default_construct
- std::uninitialized_copy_n
- std::uninitialized_fill_n
- std::uninitialized_move_n
- std::uninitialized_default_construct_n
- std::uninitialized_value_construct_n
- std::construct_at
- std::align
- 注释
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
位置:首页 > C++ 参考手册 >动态内存管理 >std::unique_ptr > std::unique_ptr<T,Deleter>::unique_ptr
std::unique_ptr<T,Deleter>::unique_ptr
若 Deleter
是指针或引用类型则此构造函数为病式。
这些重载仅若 std::is_default_constructible<Deleter>::value 为 true 且 Deleter 不是指针类型才参与重载决议。
std::unique_ptr
,以 p 初始化存储的指针,并值初始化存储的删除器。要求 Deleter
可默认构造 (DefaultConstructible) 且构造不抛异常。
若 |
(C++17 前) |
此重载仅若 std::is_default_constructible<Deleter>::value 为 true 且 Deleter 不是指针类型才参与重载决议。若类模板实参推导选择此构造函数,则程序为病式。 |
(C++17 起) |
p
的 std::unique_ptr
对象,以 p
初始化存储的指针,并按下列方式初始化删除器 D
(依赖于 D
是否为引用类型)D
是非引用类型 A ,则签名是:
unique_ptr(pointer p, const A& d) noexcept; |
(1) | (要求 Deleter 为不抛出可复制构造 (CopyConstructible) ) |
unique_ptr(pointer p, A&& d) noexcept; |
(2) | (要求 Deleter 为不抛出可移动构造 (MoveConstructible) ) |
D
是左值引用类型 A& ,则签名是:
unique_ptr(pointer p, A& d) noexcept; |
(1) | |
unique_ptr(pointer p, A&& d); |
(2) | |
D
是左值引用类型 const A& ,则签名是:
unique_ptr(pointer p, const A& d) noexcept; |
(1) | |
unique_ptr(pointer p, const A&& d); |
(2) | |
若 |
(C++17 前) |
若 |
(C++17 起) |
2-4) 数组特化中表现同初等模板中接收一个指针参数的构造函数,除了它们不另外参与重载决议,除非下列之一为真:
|
(C++17 起) |
u
转移所有权给 *this 构造 unique_ptr
并存储空指针于 u
。此构造函数仅若 std::is_move_constructible<Deleter>::value 为 true 才参与重载决议。若 Deleter
不是引用类型,则要求它为不抛出可移动构造 (MoveConstructible) (若 Deleter
是引用,则 get_deleter()
和 u.get_deleter()
在移动构造后引用相同值)。u
转移所有权给 *this 构造 unique_ptr
,其中 u
以指定的删除器( E
)构造。它依赖于 E
是否引用类型,如下:
E
是引用类型,则从 u
的删除器复制构造此删除器(要求此构造不抛出)E
不是引用类型,则从 u
的删除器移动构造此删除器(要求此构造不抛出)pointer
Deleter
是引用类型且 E
与 D
为同一类型,或 Deleter
不是引用类型且 E
可隐式转换为 D
6) 数组的特化中,表现同在初等模板中者,除了它仅若下列皆为真才会参与重载决议
|
(C++17 起) |
unique_ptr
,其中以 u.release()
初始化存储的指针,并值初始化存储的删除器。此构造函数仅若 U*
可隐式转换为 T*
且 Deleter
与 std::default_delete<T>
为同一类型才参与重载决议。参数
p | - | 指向要管理的对象的指针 |
d1,d2 | - | 用于销毁对象的删除器 |
u | - | 获取所有权来源的智能指针 |
注意
使用 std::make_unique<T> 是更好的做法,可取代与 new 一起的重载 (2) 。
std::unique_ptr<Derived> 通过重载 (6) 可隐式转换为 std::unique_ptr<Base> (因为被管理指针和 std::default_delete 都可隐式转换)。
因为默认构造函数是 constexpr
,故静态的 unique_ptr 作为静态非局部初始化的一部分初始化,在任何动态初始化之前。这使得在任何静态对象的构造函数中使用 unique_ptr 是安全的。
无源自指针类型的类模板实参推导,因为不可能辨别来自 |
(C++17 起) |
示例
#include <iostream> #include <memory> struct Foo { // 要管理的对象 Foo() { std::cout << "Foo ctor\n"; } Foo(const Foo&) { std::cout << "Foo copy ctor\n"; } Foo(Foo&&) { std::cout << "Foo move ctor\n"; } ~Foo() { std::cout << "~Foo dtor\n"; } }; struct D { // 删除器 D() {}; D(const D&) { std::cout << "D copy ctor\n"; } D(D&) { std::cout << "D non-const copy ctor\n";} D(D&&) { std::cout << "D move ctor \n"; } void operator()(Foo* p) const { std::cout << "D is deleting a Foo\n"; delete p; }; }; int main() { std::cout << "Example constructor(1)...\n"; std::unique_ptr<Foo> up1; // up1 为空 std::unique_ptr<Foo> up1b(nullptr); // up1b 为空 std::cout << "Example constructor(2)...\n"; { std::unique_ptr<Foo> up2(new Foo); // up2 现在占有 Foo } // Foo 被删除 std::cout << "Example constructor(3)...\n"; D d; { // 删除器类型不是引用 std::unique_ptr<Foo, D> up3(new Foo, d); // 复制删除器 } { // 删除器类型是引用 std::unique_ptr<Foo, D&> up3b(new Foo, d); // up3b 保有到 d 的引用 } std::cout << "Example constructor(4)...\n"; { // 删除器不是引用 std::unique_ptr<Foo, D> up4(new Foo, D()); // 移动删除器 } std::cout << "Example constructor(5)...\n"; { std::unique_ptr<Foo> up5a(new Foo); std::unique_ptr<Foo> up5b(std::move(up5a)); // 所有权转移 } std::cout << "Example constructor(6)...\n"; { std::unique_ptr<Foo, D> up6a(new Foo, d); // 复制 D std::unique_ptr<Foo, D> up6b(std::move(up6a)); // 移动 D std::unique_ptr<Foo, D&> up6c(new Foo, d); // D 是引用 std::unique_ptr<Foo, D> up6d(std::move(up6c)); // 复制 D } #if (__cplusplus < 201703L) std::cout << "Example constructor(7)...\n"; { std::auto_ptr<Foo> up7a(new Foo); std::unique_ptr<Foo> up7b(std::move(up7a)); // 所有权转移 } #endif std::cout << "Example array constructor...\n"; { std::unique_ptr<Foo[]> up(new Foo[3]); } // 删除三个 Foo 对象 }
输出:
Example constructor(1)... Example constructor(2)... Foo ctor ~Foo dtor Example constructor(3)... Foo ctor D copy ctor D is deleting a Foo ~Foo dtor Foo ctor D is deleting a Foo ~Foo dtor Example constructor(4)... Foo ctor D move ctor D is deleting a Foo ~Foo dtor Example constructor(5)... Foo ctor ~Foo dtor Example constructor(6)... Foo ctor D copy ctor D move ctor Foo ctor D non-const copy ctor D is deleting a Foo ~Foo dtor D is deleting a Foo ~Foo dtor Example constructor(7)... Foo ctor ~Foo dtor Example array constructor... Foo ctor Foo ctor Foo ctor ~Foo dtor ~Foo dtor ~Foo dtor