在Haskell中删除对象时调用函数
Calling a function at object deletion in Haskell
我正在为一个c++类编写一个Haskell包装器。我决定将其表示为Haskell数据结构,其中包含指向c++中的类实例的指针(Foreign.Ptr)。差不多就是这样。
在c++:class MyClass {
public:
double my_method();
// ...
};
extern "C" MyClass* cpp_new_MyClass() {
return new MyClass();
}
extern "C" double cpp_my_method(MyClass *obj) {
return obj->my_method();
}
在Haskell: Data MyClass = MyClass (Ptr ())
foreign import ccall "cpp_new_MyClass" cppNewMyClass :: Ptr ()
foreign import ccall "cpp_my_method" cppMyMethod :: Ptr () -> Double
mkMyClass :: MyClass
mkMyClass = MyClass cppNewMyClass
myMethod :: MyClass -> Double
myMethod (MyClass ptr) = cppMyMethod ptr
问题是,我不知道如何正确地实现MyClass删除。在某些情况下,Haskell垃圾收集器将删除MyClass对象,但它不会触发c++中的MyClass*内存释放。我该如何解决这个问题?
我知道ForeignPtr,但它使用IO
monad,这是不满意的,因为我希望包装的数据结构的行为完全像一个正常的Haskell数据结构,而不需要显式分配/释放内存或IO
monad。
“它使用
IO
monad,这是不满意的,因为我希望包装的数据结构的行为完全像一个普通的Haskell数据结构”
你当然知道,但不幸的是这是不可能的。外国";functions”总是可以做一些在Haskell中不可能做的有趣的事情;类型系统没有办法查看并阻止它。
这个困境是我们有unsafePerformIO
的唯一(!)原因,实际上你的是一个很好的例子,一个有效的应用程序。
我自己还没有这样做,但是你的代码应该像下面这样:
extern "C" void cpp_delete_MyClass(MyClass* obj) {
delete obj;
}
foreign import ccall "cpp_new_MyClass" cppNewMyClass :: IO (Ptr ())
foreign import ccall "&cpp_delete_MyClass" cppDeleteMyClass :: FunPtr (Ptr () -> IO ())
data MyClass = MyClass (ForeignPtr ())
mkMyClass :: MyClass
mkMyClass = unsafePerformIO $ do
newObj <- cppNewMyClass
fPtr <- newForeignPtr cppDeleteMyClass newObj
return $ MyClass fptr
我不太确定这些FunPtr
s,希望有人能评论一下…
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?