智能指针std::unique_ptr
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
智能指针std ::unique_ptr
std::unique_ptr
1.特性
1) 任意时刻unique_ptr 只能指向某⼀个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调⽤析构函数实现删除对象)
2)禁⽌拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete ),可以使⽤std::move()、unique_ptr.reset(...) 转移对象指针控制权。
(由1决定,指针发⽣了拷贝就违反了第⼀条)
2.怎么实现禁⽌拷贝构造和赋值构造?
拷贝构造 和 赋值符‘=’ 对应函数 被删除了,所以⽤不了。
(看下⾯的构造函数表)
可以在IDE/编辑器中查看详细实现:(下⾯是 GNU g++的实现)
我们可以看到,拷贝和赋值函数被禁⽌实现(禁⽤)了。
更加详细的内容参阅cppreference:
① 构造
②
3. 使⽤default (1)
constexpr unique_ptr() noexcept;from null pointer (2)
constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}from pointer (3)explicit unique_ptr (pointer p) noexcept;from pointer + lvalue deleter (4)unique_ptr (pointer p,
typename conditional<is_reference<D>::value,D,const D&> del) noexcept;
from pointer + rvalue deleter (5)unique_ptr (pointer p,
typename remove_reference<D>::type&& del) noexcept;
move (6)unique_ptr (unique_ptr&& x) noexcept;
move-cast (7)template <class U, class E>
unique_ptr (unique_ptr<U,E>&& x) noexcept;
move from auto_ptr (8)template <class U>
unique_ptr (auto_ptr<U>&& x) noexcept;拷贝构造
拷贝构造
copy (deleted!) (9)
unique_ptr (const unique_ptr&)= delete;复制作业(删除!)(4)unique_ptr &operator =(const unique_ptr &)= delete;
1 #include <iostream>
2 #include <memory>
3 using namespace std;
4
5 // unique_ptr::get vs unique_ptr::release
6 int main()
7 {
8 std::unique_ptr<int > foo; //foo - null
9 std::unique_ptr<int > bar; //bar - null
10 int * p = nullptr;
11 foo = std::unique_ptr<int >(new int (100));// foo - 100
12 bar = std::move(foo); // foo 转移给bar bar - 100 foo - null
13 p = bar.get (); // p - 100 smart pointer.get ()返回⼀个指向该对象的内置指针
14 foo.reset(bar.release()); // bar 放弃指针控制权,返回指针给foo foo - 100, bar 已经不存在
15
16 cout << "foo : " << *foo << endl;
17 cout << "p : " << *p << endl;
18delete p; //记得删除,这也是使⽤智能指针的初衷之⼀---防⽌内存泄漏19
20if (bar)
21 cout << "bar : " << *bar << endl;
22else
23 cout << "bar已经被释放" << endl; //这⾥bar已经销毁了,可能会报错。
24
25return0;
26 }。