d--2.092版本的借用与所有权翻译
指针的借用/所有权模型
其可保证转义
指针到有效内存对象.
(借/权)适用范围
对D适用的,当前只针对指针
,无动态数组,类引用,引用或聚集体的指针
,目前不支持.
RAII,是安全的,(OB)无须关心,也无须关心如何分配内存
当前仅对带@活
属性标记的函数有用.在完成语义分析后仅仅检查是否违反借/权
规则,没加新符号,也没改新生成代码.
@活
调用非活
函数时,尽管不检查非活
函数,但要求他们有与@活匹配的接口
.
非活
调用@活
函数时,要求参数遵守@活
的约定.
借/权
检查:
1,转义无效
状态指针.
2,多个指向可变内存对象的活动指针.
不检查转义空针/空针
.目前不能把类型注解为非空针
指针.
##核心准则
对每块内存,只能有一个可变指针或多个不变指针
.即只能1个写或多个读
.两者不能同时存在.
##设计
唯一的可变指针称为内存对象的所有者
(传递性的拥有(内存对象图),就像一个皇帝).
只有它有权利,可安全管理内存(改变形状,分配,释放,调整),只一个指针有权,所以不担心有其他指针乱搞他的地盘里的东西.
多个只读指针,也是安全的.不用担心有鬼,(悄悄的改变数据).
其余关心指针如何成为所有者/只读/无效指针
指针,及如何一直保持核心借/权
准则.
##跟踪指针
只跟踪在@活
函数中的本,函数参数,局部变量
.
不跟踪其他函数的变量及@活
变量.因为与其他函数的交互只取决于函数签名,而不是其内部变量.
也不跟踪常参数
.
##指针状态
1,未定义
无效状态,不能转义这种指针.
2,所有者
皇帝,一般无域
属性.如果带域属性指针用不从跟踪指针继承的表达式
初化的,则是皇帝.相当于说是根
.
把一个皇帝指针值传给另一个皇帝指针,则前皇帝指针失效.即移动
.感觉有问题.
本来两个皇帝,变成一个了,而且两个的地盘的都变了.传的皇帝,自己啥也没了,被传的皇帝,自己的地盘变了.原来的指针也找不着了.
3,借用(写针
)
临时变成皇帝,原皇帝退休,不能活动,直到别人还给你,且只能有一个.借用指针必须有域属性
且是可变指针
4,只读(读针
)
当只读从皇帝借时,大家都只能只读.必须有域属性
,且是不可变
指针.
##生命期
读写指针
生命期为:开始读到最后读时.而不是在初化/赋值时.也叫非词法
生命期
##转换状态
如下时转换:
分配存储时,未定义
,如栈上局部变量.
初化(当作赋值)
赋值(基于源目标指针的当前状态,类型和存储类
而变)
传递到出
函数参数(函数返回时改变),与初化一样
按引用传递给函数参数,根据存储类,函数返回参数类型
来判定是对借用/只读
的赋值.
按值传递给函数参数,当作赋值
参数.
隐式按引用
把闭包传递给嵌套函数.
取指针地址,赋值
给接收者
取内存对象图的任意部分地址,赋值
给接受者
从内存对象图任意部分读到的指针值,赋值给指针接受者
合并控制流根据每个变量的边界条件来调整状态
不跟踪类及关联数组引用->垃集
从非皇帝
借或读
只跟踪皇帝的泄漏
如从非指针
初化,则借者也当作皇帝.
@live void uhoh()
{
scope p = malloc(); // p,皇帝
scope const pc = malloc(); // pc,非皇帝
} //退出时未检查到pc悬挂指针
有这种域
指针好像没用,可能可以直接当错误处理.
不跟踪嵌套函数读写指针
@live void ohno()
{
auto p = malloc();
void sneaky() { free(p); }
sneaky();
free(p); //未检查到双释放
}
##异常
该分析假定不引发异常
@live void leaky()
{
auto p = malloc();
pitcher(); //抛异常,则泄露
free(p);
}
这样:
@live void waterTight()
{
auto p = malloc();
scope(exit) free(p);
pitcher();
}
//或RAII
不考虑懒参数
次生行为
保持@活
最小.
##混合内存池
不同内存池的冲突
void* xmalloc(size_t);
void xfree(void*);
void* ymalloc(size_t);
void yfree(void*);
auto p = xmalloc(20);
yfree(p); // 相反应调用xfree()
未检测到,减轻
U* umalloc();
void ufree(U*);
V* vmalloc();
void vfree(V*);
auto p = umalloc();
vfree(p); // 不匹配类型
可能在@活
函数中最好禁止隐式转换为空 *
.
【推荐】国内首个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岁的心里话
· 按钮权限的设计及实现