【ZIG】ArrayList中toOwnedSlice后使用deinit为什么是安全的?

toOwnedSlice和deinit的顺序

如果想要toOwnedSlicedeinit同时使用,这需要保证toOwnedSlicedeinit之前。

但是,同时使用是没有必要的,因为toOwnedSlice会复制一份原来切片的内存返回出去,同时会清除原来ArrayList中切片的内存,并且把capacity置为0

也就是说,toOwnedSlice其实本身就会清除内存,不需要deinit再清除一遍

为什么同时使用不会出现二次释放?

这是因为toOwnedSlice中会调用clearAndFree方法,这个方法一共有三行:

clearAndFree

其中,allocatedSlice

allocatedSlice

再看deinit方法:

deinit

可以看到,clearAndFree其实是包含了deinit步骤的,它们都是释放切片的0到capacity区间的内存> 当我们调用了toOwnedSlice,会释放0…capacity的内存,然后方法会把capacity置为0,下一次deinit要释放内存的话,其实就是释放的0…0的内存,这样释放是安全的(相当于没释放)

下面代码可以正常编译运行:

没问题

代码可以编译但是无法运行:

在这里插入图片描述

先deinit再toOwnedSlice报错

toOwnedSlice代码:

在这里插入图片描述
由于deinit直接释放了内存,没有更新capacity,导致复制内存的时候直接报错

  • 23
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值