【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,导致复制内存的时候直接报错

相关推荐

  1. React使用usePrevious意义什么啥要用它

    2024-05-12 16:52:03       22 阅读
  2. 面试官:HashMap什么线程不安全

    2024-05-12 16:52:03       37 阅读
  3. Redis 什么单线程

    2024-05-12 16:52:03       62 阅读
  4. MATLAB符号计算什么?如何使用它?

    2024-05-12 16:52:03       43 阅读
  5. MATLAB符号计算什么?如何使用它?

    2024-05-12 16:52:03       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 16:52:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 16:52:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 16:52:03       87 阅读
  4. Python语言-面向对象

    2024-05-12 16:52:03       96 阅读

热门阅读

  1. PostgreSQL自带的命令行工具10- pg_basebackup

    2024-05-12 16:52:03       38 阅读
  2. Linux上的监控工具:Zabbix、Prometheus、APM和ELK

    2024-05-12 16:52:03       31 阅读
  3. SSL VPN

    SSL VPN

    2024-05-12 16:52:03      31 阅读
  4. 2024.5.12 ubuntu + latex + vscode

    2024-05-12 16:52:03       33 阅读
  5. springboot Redis 支持星号(*) 包括注解@Cache

    2024-05-12 16:52:03       31 阅读
  6. Oracle一键安装脚本安装教程合集

    2024-05-12 16:52:03       35 阅读
  7. SSH简介:网络安全的守护者

    2024-05-12 16:52:03       37 阅读
  8. 对Promise的理解

    2024-05-12 16:52:03       32 阅读
  9. 【C++】引用传递 & 常量引用

    2024-05-12 16:52:03       36 阅读