c# - C# 初始化和销毁封送内存
问题描述
我有一个来自 C 库的函数,它根据结构的大小和 id 为结构分配内存,id 是在运行时使用注册器函数分配的。函数看起来像这样
void *allocate_objects(uint32_t structure_id, uint32_t size, uint32_t count,
void *(*constructor)(void *), void (*destructor)(void *));
此外,它需要一个指向用于初始化分配的内存的构造函数的指针和一个在内存被释放后调用的析构函数(它可能不会被释放,但不再保留并且可以被库重用)。
该库不关心使用分配的内存中的实际内容allocate_objects
,它只为它们管理内存。
我想从我的 C# 代码中将它与 C# 结构和类一起使用,但是我不知道如何正确地将构造函数和析构函数传递给分配函数。
我对如何完成有几个想法:
- 使用反射从工厂函数中获取类型的构造函数和析构函数,然后将其传递给 C 代码
- 让与库一起使用的类/结构实现一些成员函数(例如
onCreate
和onDestroy
),然后从工厂函数中调用
我是编组 C# 代码的菜鸟,所以我对这些想法有一些疑问:
- 是否有某种方法可以对已分配的内存使用反射?
- 如果我使用重载的虚拟函数,在未初始化的内存上调用它们是否安全(
allocate_objects
将执行等价的malloc
并且内存不会被归零) - 我与库一起使用的类型的约束是什么?我假设我不会被允许使用任何非原始类型,因为 GC 将无法到达 C 库使用的内存,或者当对象被 C 销毁时有办法强制 GC图书馆?
解决方案
推荐阅读
- mysql - 如何查询具有重复节点的闭包表的路径?
- hibernate - Hibernate 通过仅传递“父”实体的 id 创建 OneToMany 的子对象
- javascript - Slick Slider 不适用于 PHP 中的 Loop
- python-3.x - 运行 face_recognition 模型导致“python 已停止工作”
- jmeter - 是否可以在不提供附件的情况下使用 SMTP Sampler?
- python - Django:聚合查询集结果的更好方法
- android - 从实时数据更改活动导致内存泄漏
- json - Swift - 参数类型不符合预期类型
- ios - 如何在 swift 中使用 google maps sdk 的地理编码请求邮政编码?
- rust - 如何获得有序集/有序图的最大值和最小值?