C++中为什么不要使用从破损的智能指针获取的指针或引用
发表于:2025-02-16 作者:千家信息网编辑
千家信息网最后更新 2025年02月16日,本篇内容主要讲解"C++中为什么不要使用从破损的智能指针获取的指针或引用",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++中为什么不要使用从破损的智能指
千家信息网最后更新 2025年02月16日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安全错误
数据库的锁怎样保障安全
计算机网络安全趋势
网络安全应急中心夜班
西城区网络技术信息采购
湖北联想服务器虚拟化哪家好
一个拖线板能支持几台服务器
互联网科技类公司税收筹划
数据库的datetime
数据库参数个数
古巴网络技术
网络安全各个等级分化判断
湖南服务器电源生产厂
软件开发者选项打开后怎么设置
互联网 高科技 生物医药
小程序的网络安全
新一代信息网络安全接入网
01年的热血传奇有几个服务器
在数据库中什么是事物处理
北航网络安全研究生学院
网络安全讲座稿
四川移动服务器云服务器
靶向数据库
数据库慢查询监控
网络技术类是什么
怎样上传文件在服务器
接入层网络安全问题有哪些
sql数据库时区
服务器安全校验失败
软件开发税率多少钱
风暴峭壁服务器
hostus配置服务器