使用 dart ffi 类型安全内存分配

type safe memory allocation with dart ffi

我正在努力使我的代码在为 ffi 分配内存时更加健壮。

我编写了以下函数:

void withMemory<T extends NativeType>(
    int size, void Function(Pointer<T> memory) action) {
  final memory = calloc<Int8>(size);
  try {
    action(memory.cast());
  } finally {
    calloc.free(memory);
  }
}

调用上面的函数我使用:

withMemory<Uint32>(sizeOf<Uint32>(), (phToken) {
  // use the memory allocated to phToken
});

这可行,但如您所见,我需要传递两次 Uint32 以及 sizeOf

我真正想写的是:

withMemory<Uint32>((phToken) {
  // use the memory allocated to phToken
});

问题是您无法将泛型类型传递给 callocsizeOf 而不会出现错误:

The type arguments to [...] must be compile time constants but type parameters are not constants. Try changing the type argument to be a constant type.

有什么办法解决这个问题吗?

现在可以使用 package:ffi 中的 Arena 分配器来完成。

using((Arena arena) {
  final p = arena<Uint32>();
  // Use the memory allocated to `p`.
}
// Memory freed.

文档: