dip25,中与引用.
原地址
参考地址
作者:W.B,AA.
大意:d
提供了许多系统级
编码的功能,如无限制
指针,整数和指针转换
及@系统属性
.但,定义
这些危险
操作时,还要考虑经济
性.本dip
能够保证引用
不指向损坏对象
.
总之
接收并想
返回引用
的函数,必须用中
注解.模板/λ
可以推导出,但其他声明必须显式注解
.如:
@安全:
引用 整 函数(引用 整 a){中 a;}//错误
引用 整 滚(中 引用 整 a){中 a;}//好
引用 T 匈牙利(T)(引用 T a){中 a;}//好,模板用推导
描述:
当前d
对避免悬挂指针
有些规定:
引用 整 函数(整 x){
中 x;//错误:转义引用到本地变量x
}
引用 整 滚(){
整 x;
中 x;//错误:转义引用到本地变量x
}
构 S{
整 x;
}
引用 整 匈牙利(){
S s;
中 s.x;//见
}
引用 整 i未(){
整 a[42];
中 a[5];//见
}
然而,是很浅的.以下代码编译
并允许通过失效栈位置
读写,而绕开了域和生命期规则.
引用 整 身份(引用 整 x){
中 x;//通过空函数
}
引用 整 函数(整 x){
中 身份(x);//转义形参地址
}
引用 整 滚(){
整 x;
中 身份(x);//转义本地地址
}
构 S{
整 x;
引用 整 取(){中 x;}
}
引用 整 匈牙利(S x){
中 x.取;//转义形参部分地址
}
引用 整 i未(){
S s;
中 s.取;//转义本地部分地址
}
引用 整 j未(){
中 S().取;//最差竞争者:转义右值部分地址
}
这些例子中的转义模式
是很明显的.不用递归,且可自动找到
.但,编译器
不能看到身份/S.取()
的实体,我们需要根据函数签名
来得到足够进行安全分析
的信息.
本dip
允许按引用
下传对象至函数
,并从函数
中用引用
返回.并确保引用的安全(不指向已析构对象).
加中为函数属性
主要问题是检查返回T引用且按引用接收的一些参数
的函数.已经直接解决了返回本地/部分
的.只剩下返回按引用传递的参数的引用T
,即参数/返回
都是同样的引用
.
关键是区分合法与非法
.一种太保守的是禁止返回引用参数
,这禁止了身份
.因而,按引用访问容器元素,就很难或不可能正确
检查类型.
具确定性析构
(如,引用计数)的堆分配
结构必须为所有访问插入成员副本.
本dip
添加中
来延长
参数生命期至函数返回值
.即,只有标记了中
的参数,才允许返回
参数(或部分).身份
这样写:
@安全 引用 整 错误身份(引用 整 x){
中 x;//错误!不能中引用,请用"中 引用"
}
@安全 引用 整 身份(中 引用 整 x){
中 x;//好
}
仅通过看签名,引用 整 身份(中 引用 整 x)
,编译器假定身份的结果<=x
的生命期
,并相应检查类型.给定上个身份
定义,则:
@安全 引用 整 函数(中 引用 整 x){
整 a;
中 a;//错误每当前语言规则
静 整 b;
中 b;//好每当前语言规则
中 身份(a);//错误,可能转义本地地址
中 x;//好,传播x的生命期到输出
中 身份(x);//好,通过身份传播x的生命期到输出
中 身份(身份(x));//好,两次通过身份传播x的生命期到输出
}
@安全 引用 整 滚(引用 整 输入){
静 整[42]数据;
中 数据[输入];//工作,可总是中@静活数据
}
@安全 构 S{
私 整 x;
引用 整 取()中{中 x;}//应工作,见下节
}
与动交互
用中
在动 引用
上是非法
的.对泛型/λ函数
,作为纯,一般不要求用中
.
动 引用 T 身份(动 引用 T x){
中 x;//正确,对中不需要
}
结果类型对比参数
考虑:
@安全 引用 整 函数(中 引用 浮 x);
本dip
忽略类型,如参数为中 引用
,则可转义为结果
.也有可能函数作者
想限制输出的生命期
.
多参数,则假定为参数中的最短生命期
.
成员函数,其生命期
不能超过本
.
@安全 构 S{
静 整 a;
整 b;
引用 整 函数(){中 a;}//好,调用者假定无穷生命期
引用 整 滚(){中 b;}//错误!不能中直接成员
引用 整 匈牙利()中{中 b;}//好,结果是本内域
}
@安全,最开始本dip
仅适用@安全
,来避免破坏
.
@安全 引用 整 函数(引用 整 x) {中 x;}//错误
@安全 引用 整 滚(中 引用 整 x){中 x;}//好
@系统 引用 整 匈牙利(引用 整 x) {中 x;}//现在好,@系统代码.
@系统 引用 整 j未(中 引用 整 x){中 x;}//最佳,对中值的生命期提供更多提示到编译器
完.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现