博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
普通指针到智能指针的转换
阅读量:4040 次
发布时间:2019-05-24

本文共 1060 字,大约阅读时间需要 3 分钟。

普通指针到智能指针的转换
int* iPtr = new int(42);shared_ptr
p(iPtr);
智能指针到普通指针的转换
int* pI = p.get();
注意的地方:
那就是不要将智能指针与普通指针混用。如果项目允许,坚持使用智能指针,避免原生指针。
智能指针与普通指针需要特别特别特别的小心翼翼,比如以下的情况。
1. 普通指针到智能指针的问题
void f(shared_ptr
ptr) //增加引用计数{
// do something...} //销毁ptr,减少引用计数
我们有如下的代码:
int* iPtr = new int(42);f(shared_ptr
(iPtr));int value = *iPtr; // Error! iPtr指针指向的内容已经被释放
因为在这儿,你将普通指针赋予给了一个临时的智能指针,当调用f函数完毕后,此临时智能指针的生命周期结束,然后减少引用计数,归为0,于是,内存释放!
而这儿的更改方法是一直使用智能指针:
auto p = make_shared
(42); // 初始化的引用计数为1f(p); // 拷贝后增加为2,销毁ptr减少1,然后变为1int value = *p; //引用计数为1
2. 智能指针到普通指针的问题
auto p = make_shared
(42);int* iPtr = p.get();{
shared_ptr
(iPtr);}int value = *p; // Error! 内存已经被释放
p与iPtr指向了相同的内存,然而通过get方法后,将内存管理权转移给了普通指针。iPtr传递给里面程序块的临时智能指针后,引用计数为1,随后出了作用域,减少为0,释放内存。
额外的注意点:转换
在C++11中,极力推崇完全替代原生指针。而这里面,原生指针使用到了static_cast,dynamic_cast, const_cast的操作,需要用static_pointer_cast, dynamic_pointer_cast, const_pointer_cast对应操作,而并非使用原来的dynamic_cast等。

转载地址:http://kuxdi.baihongyu.com/

你可能感兴趣的文章
final 的作用
查看>>
在Idea中使用Eclipse编译器
查看>>
idea讲web项目部署到tomcat,热部署
查看>>
IDEA Properties中文unicode转码问题
查看>>
Idea下安装Lombok插件
查看>>
zookeeper
查看>>
Idea导入的工程看不到src等代码
查看>>
技术栈
查看>>
Jenkins中shell-script执行报错sh: line 2: npm: command not found
查看>>
8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty
查看>>
Jenkins 启动命令
查看>>
Maven项目版本继承 – 我必须指定父版本?
查看>>
Maven跳过单元测试的两种方式
查看>>
通过C++反射实现C++与任意脚本(lua、js等)的交互(二)
查看>>
利用清华镜像站解决pip超时问题
查看>>
[leetcode BY python]1两数之和
查看>>
微信小程序开发全线记录
查看>>
PTA:一元多项式的加乘运算
查看>>
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>