栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

【c++】智能指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【c++】智能指针

文章目录
  • 1.智能指针作用
  • 2.std::unique_ptr
  • 2.1 创建方式
  • 2.2 例子
  • 3.std::unique_ptr与函数调用
  • 4.std::shared_ptr
  • 5.std::shared_ptr与函数调用
  • 6.std::shared_ptr与std::unique_ptr
  • 7.weak_ptr


1.智能指针作用

引入智能指针,使得c++程序员不需要手动释放内存。

std::unique_ptr
std::shared_ptr
std::weak_ptr

c++指针分为原始指针与智能指针。智能指针可以自动分配内存,不用担心潜在的内存泄露。
最常用的就是裸指针,其次是std::unique_ptr与std::shared_ptr。
智能指针不是万能的,只解决独占/共享所有权指针的释放、传输。


2.std::unique_ptr

在任意时刻,只能有一个指针管理内存。
当指针超出作用域,内存自动释放。
该类型指针不能Copy,只能Move。

2.1 创建方式
  • 已有裸指针- 不推荐!!!
  • new unique_ptr u_c_p{new …}
  • std::make_unique<> (推荐)

通过get()获取地址
实现了->与*

2.2 例子
  1. 对象通过直接在stack上实例化及{}作用域时可以在作用域外自动销毁。
  2. 通过new在heap上创建对象时需要手动使用delete进行销毁,很不方便。

-》引申出delete该指针后,仅仅是将该块区域的占有权释放,该块区域的数据状态无定义。该指针的值未变化需要手动调成NULL。参考
-》同时不要将两个指针变量指向同一块动态内存

不要将两个指针变量指向同一块动态内存。这个容易引起很严重的问题。如果将两个指针变量指向同一块动态内存,而其中一个生命期结束释放了该动态内存,这个时候就会出现问题,另一个指针所指向的地址虽然被释放了但该指针并不等于NULL,这就是所谓的悬垂指针错误,这种错误很难被察觉,而且非常严重,因为这时该指针的值是随机的,可能指向一个系统内存而导致程序崩溃。但也就是因为值是随机的,所以运行程序时有时正常有时崩溃,这一点要特别注意。


3.std::unique_ptr与函数调用
  • 不可以Copy,只可以Move
  • 在做函数参数或者返回值要注意所有权
  1. 按值传入
    不能直接传入(Copy),必须使用std::move()转移内存拥有权,该内存区域所有权进入函数内部,执行完函数体就自动释放。因此不太推荐使用。
  2. 按引用传入(推荐)
    直接可以传入,且并不在函数体执行完进行释放。如果不对其指向进行修改推荐使用const对指针进行修饰,但是指针指向的内容可以改变。
  3. 按引用返回
    太难,不学。

4.std::shared_ptr

计数指针又称共享指针,可以共享数据。
shared_point创建了一个计数器与类对象所指的指针进行了关联。
Copy则计数器加1,销毁则计数器减1
api为use_count()

使某一个指针指向NULL时,该指针的计数器为0,其他指针的计数器减1。
最后销毁几次是看销毁的数据,将对内存的所有权放出。数据永远只有一套,所以销毁永远只有一次。


5.std::shared_ptr与函数调用
  1. 按值传入
    可以直接传入(Copy)。在函数内部计数器加1,外部不变。
  2. 按引用传入(推荐)
    直接可以传入,且并不在函数体执行完进行释放。如果不对其指向进行修改推荐使用const对指针进行修饰,但是指针指向的内容可以改变。
  3. 按引用返回
    太难,不学。

6.std::shared_ptr与std::unique_ptr

公车不能私用,但是私车可以变成公车(std::move())。

7.weak_ptr
  • 并不拥有所有权
  • 并不能使用->与*

A类中有一个需求需要存储其他A类对象的信息。
若使用shared_ptr出现循环依赖
通过shared_ptr初始化,也可以使用lock()转换为它。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037597.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号