【问题标题】:Kotlin Native Pointer initializationKotlin Native 指针初始化
【发布时间】:2022-12-19 14:38:58
【问题描述】:

我与 Kotlin Native 和运行时有一点争执。简而言之:我正在构建一个 jvmti 代理,链接一个动态库。

现在我有以下案例,我想实现的目标可以用 C 表示:

char* class_sig; 
(*jvmti)->GetClassSignature(object_klass, &class_sig, NULL) 
do something with class_sig.... 
(*jvmti)->Deallocate((unsigned char*) class_sig);

所以在那种情况下,jvmti 环境会为 class_sig 分配内存,这就是我必须通过 jvmti 环境解除分配的原因。

这在 Kotlin 中如何实现?我对调用 nativeheap.alloc 有点犹豫,这会不会导致内存泄漏,因为 jvmti 环境已经分配了内存?

或者我可以这样做:

val signaturePtr = nativeHeap.alloc<CPointerVar<ByteVar>>()
        
jvmti?.pointed?.pointed?.GetClassSignature?.invoke(jvmti, klass, signaturePtr.ptr, null)

Call jvmti dealloc?

【问题讨论】:

    标签: kotlin kotlin-multiplatform kotlin-native


    【解决方案1】:

    Kotlin Native 方法是使用 memScoped blocks 来完成这样的任务。看看official guide for C interop

    如果你写

    memScoped {
        val signaturePtr = alloc<CPointerVar<ByteVar>>()
        //...
    }
    

    Kotlin 将负责 memScoped 块内的内存释放,无需调用 jmti Deallocate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2011-04-10
      • 2012-11-10
      • 2010-12-12
      相关资源
      最近更新 更多