Skip to main content
ArkFFI 在 TypeScript 层管理部分内存,但大多数情况下 C 库的内存由 C 库自身管理。理解各场景的内存归属,可以避免泄漏和野指针。

概览

基本类型传参

intdoublechar 等基本类型通过寄存器或栈传递,不涉及任何内存分配。直接传入即可。

字符串传参

当参数类型为 FFIType.CString 时,NAPI 层会用 napi_get_value_string_utf8 获取 C 字符串,在堆上分配 char*,调用 C 函数后立即 delete[]。用户无需管理。

字符串返回值

callString 返回 C 库内部持有的 const char*,arkffi 只读取其内容(napi_create_string_utf8),不分配也不释放。指针的生命周期由 C 库管理。 结构体 fromPtrconst char* 字段同样返回指针数值,该指针指向 C 库内存,不要通过 releasePtr 释放

结构体传参

通过 StructSchema.create() 创建的 ArrayBuffer 由用户分配,传递给 C 函数后由用户自行管理其生命周期。

结构体返回值(releasePtr

dlopen / CFunctionreturnsStructSchema 时,ArkFFI 内部会:
  1. 调用 NAPI 获取 ArrayBuffer
  2. 通过 ffi.ptr 获取其数据指针
  3. ArrayBuffer 存入 g_structResults Map 防止 GC
  4. 返回指针给用户
用户通过 fromPtr 读取后,应调用 releasePtr 释放 Map 中的引用,使 ArrayBuffer 可被 GC。

不调用 releasePtr 会怎样?

g_structResults Map 持续持有 ArrayBuffer 的引用,指针始终有效。Map 条目在调用 releasePtr 或程序退出前不会被 GC,但一般不构成问题(条目数等于 struct 返回调用次数)。

释放错误指针会怎样?

releasePtr(ptr) 在 Map 中按 key 查找。如果 ptr 不是由 ArkFFI struct 返回分配的指针(例如来自 C 库的 const char*),Map 找不到该 key,静默无操作,不会崩溃。

指针类型(ptr、callback)

FFIType.ptrFFIType.callback 传达的是地址值(number),不涉及内存分配。地址由 C 库管理或由 JSCallback 内部槽位管理。

核心原则

ArkFFI 只管理自己分配的内存。C 库的内存由 C 库管理。