【问题标题】:CPointer of CPointers in Kotlin/NativeKotlin/Native 中的 CPointer 的 CPointer
【发布时间】:2020-04-11 17:54:14
【问题描述】:

我想将一个变量传递给我的 C 函数,其数据类型为 char**

如何使用 Kotlin/Native 传递这样的变量?

换句话说,如何在 Kotlin/Native 中初始化和使用嵌套的 CPointers?

【问题讨论】:

    标签: kotlin-native


    【解决方案1】:

    根据the documentationchar** 应该映射到CPointer<CPointerVar<ByteVar>>。所以,如果你想分配一个这样的指针,这样的事情应该可以工作:

    memScoped {
        val charTwoStars = allocPointerTo<CPointerVar<ByteVar>>()
    }
    

    当我在 memScoped 块内分配这个变量时,这个变量可以在块中访问,一旦块结束就被释放。

    【讨论】:

    • 您好,非常感谢。有没有办法在memScoped{}之外做到这一点?
    • 是的,你可以use nativeHeap,但是你应该自己管理内存(手动调用bnativeHeap.free)
    【解决方案2】:

    我找到了一种可行的方法。但是,它似乎不优雅。

    val tmp = "".cstr.getPointer(MemScope())
    val a = listOf(tmp).toCValues().getPointer(MemScope())
    

    【讨论】:

    • 这个完全不正确,因为内存会泄漏。 memScoped 块的全部意义在于保证我们的内存分配将被正确释放。如果您想创建具有更长生命周期的东西,请考虑 a) 在堆上分配或 b) 在 Arena 类实例上分配它。这两个展示位置都需要在程序结束时手动释放。 ``` val myArena=Arena() val A = nativeHeap.allocPointerTo>() val B = myArena.allocPointerTo>() nativeHeap.free(A.rawPtr) myArena.clear() ```
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多