使用 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
});
问题是您无法将泛型类型传递给 calloc
或 sizeOf
而不会出现错误:
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.
文档:
我正在努力使我的代码在为 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
});
问题是您无法将泛型类型传递给 calloc
或 sizeOf
而不会出现错误:
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.
文档: