文档章节

智能指针std::unique_ptr

o
 osc_n6euf5h6
发布于 2019/03/19 21:40
字数 527
阅读 14
收藏 0

精选30+云产品,助力企业轻松上云!>>>

std::unique_ptr

1.特性

1) 任意时刻unique_ptr只能指向某一个对象,指针销毁时,指向的对象也会被删除(通过内置删除器,通过调用析构函数实现删除对象)

2)禁止拷贝和赋值(底层实现拷贝构造函数和复制构造函数 = delete),可以使用std::move()、unique_ptr.reset(...) 转移对象指针控制权。

(由1决定,指针发生了拷贝就违反了第一条)

2.怎么实现禁止拷贝构造和赋值构造?

拷贝构造 和 赋值符‘=’ 对应函数 被删除了,所以用不了。  (看下面的构造函数表)

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;

可以在IDE/编辑器中查看详细实现:(下面是 GNU  g++的实现)

 

 

我们可以看到,拷贝和赋值函数被禁止实现(禁用)了。

更加详细的内容参阅cppreference:

① std :: unique_ptr 构造   

② 赋值  


3. 使用

 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;
18     delete p; //记得删除,这也是使用智能指针的初衷之一---防止内存泄漏!!!
19 
20     if (bar)
21         cout << "bar : " << *bar << endl;
22     else
23         cout << "bar已经被释放" << endl; //这里bar已经销毁了,可能会报错。
24 
25     return 0;
26 }
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

SikuliX简介及安装

一、简单介绍 SikuliIDE和Sikuli Script就是现在的SikuliX,最新版本是SikuliX1.1.0, 部分兼容Sikuli JAVA API,支持Python和Ruby,SikuliX通过定位图像和键盘鼠标来操作GUI(图形化用户界面...

osc_r5t7sskd
54分钟前
6
0
Above the Median

Above the Median 农夫约翰把他的N(1 <= N <= 100,000)奶牛排在一排来衡量他们的高度,牛i有:高度H_I(1 <= H_I <= 1,000, 000,000)纳米 – 因为FJ认为他需要精确测量!他想选择一些连续...

osc_3k29rnjy
56分钟前
6
0
Above the Median

Above the Median 农夫约翰把他的N(1 <= N <= 100,000)奶牛排在一排来衡量他们的高度,牛i有:高度H_I(1 <= H_I <= 1,000, 000,000)纳米 – 因为FJ认为他需要精确测量!他想选择一些连续...

osc_8nnvoyb1
57分钟前
9
0
python3连接mysql 稍微进阶 + 日期处理

1.踩了个操作中文的坑,结果发现之前的文章中有强调了,在连接处加:charset="utf8" conn = pymysql.connect(host = '127.0.0.1', unix_socket = '/tmp/mysql.sock', user = 'root' , passwo......

osc_fipgtxy8
58分钟前
6
0
Above the Median

Above the Median 农夫约翰把他的N(1 <= N <= 100,000)奶牛排在一排来衡量他们的高度,牛i有:高度H_I(1 <= H_I <= 1,000, 000,000)纳米 – 因为FJ认为他需要精确测量!他想选择一些连续...

osc_cj3zzdzw
59分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部