d的分配器1
原文
D最近在内存安全
的-preview=dip1000
方面取得了很大进展
,这九分要归功于Dennis Korpel
的工作.这一进展反之又使AteEskola
创建了有望在Phobos
的下个
版本中提供的SafeRefCounted
这里.
下一步是支持std.experimental.allocator
的SafeRefCounted
版本.可惜,遇见问题了.
SafeRefCounted
知道拥有有效负载
的独针
时,允许它@trusted
的调用free
,因为它(从C标准
)知道此时调用free
,不会破坏
内存.
但是,调用通用Allocator.deassign
函数,而不是free
的分配器相关的SafeRefCount
版本,不知道该函数
将做什么,因此无法标记该调用
为@trusted
.
唯一
方法是允许
释放(通过扩展free
的deallocate
)有自己的@safe
接口,这在当前的D语言
中是不可能的.至少,它需要保证指针
是指定内存块的独针
的隔离限定符
(这里).当然,所有权/借贷
也可.
这不是可在库代码
中解决的问题.必须更改语言.
好吧,阿提拉
开始了它,所以他有点功劳
.我在某个时候"偷"
了他的pr
.
它应可.要仔细定义
释放器.如果释放器
随后乱搞,则应该怪释放器
,而不是SafeRefCounted
.除非是故意内存泄漏器
或GC
,否则都无法@safe
,因此用户必须编写错误的@trusted
或@system
代码,才能导致UB
.
我同意,对思考如何改善@live
的人,阅读孤立(isolated)
的工作原理
是值得的.
这是约定
安全,正是@safe
要摆脱的.可在示例
代码和小型
项目中工作,但它不能扩展
,因为维护安全
要求的工作量
会随程序大小
(与代码
路径数成比例)呈指数级
增长.
为此,需要编译器
强制约束
释放器.
为什么?释放器
必然是@system
.
表明是否启用
分配器引用计数
并不重要.总之,根据约定
,释放器
内部都是安全
的,但假定正确编写释放器
,由编译器
在客户代码
中确保安全
.
如果有隔离(isolated)
,则可让释放器
带隔离指针
参数来使它@safe
.
你是对
的,仅让编译器
在deallocer
上约束
是不够的,调用代码
还必须知道约束
规则.
长远看
,此语言变化
是理想
的.然而,观点是,我们不能等待它.使用当前
语言可启用
分配器的安全引用计数器
(也许有些漏洞
).缺点是必须不仅审查释放器
自己导致UB
,还要避免泄漏指针
来让@safe
代码访问它.
好吧,当然,编写不合理
的@trusted
代码,总可@safe
.😃
SafeRefCounted
析构器不会
像现在这样不健壮
.如果free
乱搞,析构器
上的@trusted
属性将无效.它与自定义
释放器一样.
由C语言标准
定义free
的接口.原位(包括社会和技术)有很多适当
保护措施,以避免不合理
的释放(free)
进入你的程序.
因此,对SafeRefCount
的@trusted
析构器来说,依赖符合C语言标准
的free
风险不大.
无此类保护措施
的自定义释放器
很可能会破坏内存安全
.
因此,使用自定义释放器
时,@safe
代码中允许内存破坏
的风险比使用free
时要高得多.
:这样说,只有可证明没有其他别名
时才可释放
?
在@safe
代码,这是释放内存
的必要
条件.仅当它不创建悬针
时,才能这样.
:此时,不妨使用该证明
,并让编译器
为你释放
.😉
不一定
.证明依赖
如引用计数
等编译器不一定知道的运行时信息
.此时,可转换指针为@trusted
代码中的隔离
(类似锁互斥锁
后,丢弃@trusted
代码中的共享(shared)
).
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现