C++中为什么不要使用从破损的智能指针获取的指针或引用
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"C++中为什么不要使用从破损的智能指针获取的指针或引用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++中为什么不要使用从破损的智能指
千家信息网最后更新 2025年12月02日C++中为什么不要使用从破损的智能指针获取的指针或引用
本篇内容主要讲解"C++中为什么不要使用从破损的智能指针获取的指针或引用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++中为什么不要使用从破损的智能指针获取的指针或引用"吧!
R.37: 不要使用从破损的智能指针获取的指针或引用
Reason(原因)
违反本规则是引用计数丢失和发生悬空指针的第一号理由。函数更应该沿着调用链向下传递原始指针和引用。你应该在调用树的最顶端,从可以保证对象存在的智能指针获得原始指针或引用。你需要保证智能指针不会在调用树的下面被不小心重置或者重新赋值。
Note(注意)
要做到这点,你需要获取一个智能指针的局部拷贝,通过它可以在函数和调用树执行期间将对象牢牢地锁定。
Example(示例)
考虑以下代码:
// global (static or heap), or aliased local ...
shared_ptr g_p = ...;
void f(widget& w)
{
g();
use(w); // A
}
void g()
{
g_p = ...; // oops, if this was the last shared_ptr to that widget, destroys the widget
}
下面的代码应该无法通过代码评审:
void my_code()
{
// BAD: passing pointer or reference obtained from a non-local smart pointer
// that could be inadvertently reset somewhere inside f or its callees
f(*g_p);
// BAD: same reason, just passing it as a "this" pointer
g_p->func();
}
为了改正这个问题--获取指针的局部拷贝以便为调用树"保持引用计数"。
void my_code()
{
// cheap: 1 increment covers this entire function and all the call trees below us
auto pin = g_p;
// GOOD: passing pointer or reference obtained from a local unaliased smart pointer
f(*pin);
// GOOD: same reason
pin->func();
}Enforcement(实施建议)
(简单)如果函数调用时使用了一个从非局部智能指针变量(Unique_pointer or Shared_pointer)获取的指针或者引用,报警。智能指针是局部变量但是可能是别名时也报警。如果智能指针是一个Shared_pointer,建议获取一个智能指针的局部拷贝然后从该拷贝获取指针或引用。
到此,相信大家对"C++中为什么不要使用从破损的智能指针获取的指针或引用"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
指针
智能
局部
破损
拷贝
C++
代码
函数
原始
内容
变量
对象
建议
保证
学习
报警
实用
更深
兴趣
别名
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
双代号网络技术的特点
上海氪糖网络技术中心
网二服务器进不去怎么办
gps网络服务器地址
网络安全的团会特色
学软件开发需要打好哪些基础
天津市金盈软件开发有限公司
中国互联网十大科技创新品牌
深刻认识网络安全的重要意义
为啥打开58显示服务器异常
吉林通信软件开发服务价钱
易实现的数据库项目
网络安全建设费用如何计算
网络安全保密原理
微观互联网科技
怀旧服部落服务器命令
数据库相关的就业岗位有哪些
辽宁潮流软件开发服务五星服务
安顺华为服务器总代理
b服务器
私人服务器要域名吗
android数据库中文
电视 网络安全会议记录
mfc odbc 数据库
四川数据库外泌体价格
北京前端软件开发价格
网络安全设计
任正非哪年签署网络安全声明
服务器安全狗 二合一
虹口区网络技术信息