Kotlin/Native 垃圾收集器如何在 C 中工作?

How Kotlin/Native garbage collector works in C?

我在 JetBrains FAQ 中找到了一些关于 Kotlin/Native 内存管理模型的解释。

A: Kotlin/Native provides an automated memory management scheme, similar to what Java or Swift provides. The current implementation includes an automated reference counter with a cycle collector to collect cyclical garbage.

我或多或少了解它在 Java 或 Kotlin (JVM) 中的工作原理。任何人都可以详细描述在 C 项目中如何在 Kotlin/Native 中管理内存吗?

此外,如果有垃圾收集器,为什么我们需要一个 Kotlin/Native 函数 memScoped { }?

此外,我发现 here :

Kotlin/Native is a technology for compiling Kotlin to native binaries that run without any VM. Broadly speaking, Native code is any code whose memory is not managed by the underlying framework but has to be managed by the programmer themselves. i.e. there is no Garbage collection. e.g. C++’ delete and C’s free

我认为这与 JetBrains FAQ 中的内容相矛盾

K/N 中的内存管理由运行时提供。它由两个主要部分组成:自动引用计数和循环收集器。这提供了编写代码的可用性,就像在 Kotlin/JVM 中一样。可以在此 file 中找到有关此主题的一些详细信息,但您需要知道的是默认情况下它是自动的。


关于 MemScoped 等 当您使用与 C 的互操作性时,您必须处理管理诸如 本机内存 之类的资源。本机内存是操作系统提供给应用程序进程的内存。由于它与 Kotlin 代码无关,因此 K/N 运行时无法管理此资源。但是你要使用的所有 C struct 和变量都必须在那里分配。您可以通过调用 nativeHeap.alloc() 函数直接完成。当不再需要此内存时,可以通过 nativeHeap.free() 释放它。 但为了让您的体验更舒适,K/N 还有 Arena class,实现了 region-based 内存管理。它将内存管理简化为您需要的一系列 alloc(),并通过 .clear() 对所有区域进行一次释放。 此外,还有一个 MemScoped {} 块,它覆盖了您的 Arena,甚至可以忘记释放本机内存。所以在你的代码中包含一些来自 C 的元素,你可以只写 MemScoped { ... },然后将操作放入其中。您可以在 K/N 存储库

samples 中看到很多这种方法的示例