toOwnedSlice和deinit的顺序
如果想要toOwnedSlice
和deinit
同时使用,这需要保证toOwnedSlice
在deinit
之前。
但是,同时使用是没有必要的,因为toOwnedSlice
会复制一份原来切片的内存返回出去,同时会清除原来ArrayList中切片的内存,并且把capacity置为0
也就是说,toOwnedSlice
其实本身就会清除内存,不需要deinit再清除一遍
为什么同时使用不会出现二次释放?
这是因为toOwnedSlice
中会调用clearAndFree
方法,这个方法一共有三行:
其中,allocatedSlice
:
再看deinit
方法:
可以看到,clearAndFree
其实是包含了deinit
步骤的,它们都是释放切片的0到capacity区间的内存> 当我们调用了toOwnedSlice
,会释放0…capacity的内存,然后方法会把capacity置为0,下一次deinit要释放内存的话,其实就是释放的0…0的内存,这样释放是安全的(相当于没释放)
下面代码可以正常编译运行:
代码可以编译但是无法运行:
先deinit再toOwnedSlice报错
toOwnedSlice
代码:
由于deinit
直接释放了内存,没有更新capacity,导致复制内存的时候直接报错