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);  // 不匹配类型

可能在@活函数中最好禁止隐式转换为空 *.

posted @   zjh6  阅读(8)  评论(0编辑  收藏  举报  
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示