0

该场景非常简单,我2.10.8在我的应用程序中嵌入了单声道运行时,并且我通过以下方式获得的指针调用托管方法mono_method_get_unmanaged_thunk

// obtain pointer
bool (__stdcall*foo) (MonoException**);
foo = mono_method_get_unmanaged_thunk(somemethod);

// call it
MonoException* exc;
foo(&exc);
if(exc)
    // handle exception
// nothing else...

让我感到困惑的是,我没有对MonoException指针做任何其他事情(我读过的文档没有说明这一点)。是否由托管运行时处理删除?如果是这样,如何确定我的本地端没有持有指向它的指针?

编辑

我通读了源代码,发现异常只是指向用创建的对象的指针mono_object_new,因此它们是垃圾收集的主题。

现在,我还读到如果我想在本机端保留一些指针并防止它被垃圾,我需要为它获取 GC 句柄。所以现在的(修改后的)问题是:

如果返回的指向异常对象的指针的点仅用作错误报告工具,并且在托管调用之后立即进行此类错误报告,那么可以安全地假设它在我处理它之前不会被垃圾(不使用 gc 句柄)?

4

1 回答 1

1

引用您链接的页面: 请注意,LOCAL 变量不需要此注册,因为它们存储在堆栈中。只有全局变量才需要,因为它们不是 GC 根集的一部分。

所以这意味着在您的场景中您不必分配句柄。

于 2012-11-06T17:21:59.153 回答