【发布时间】:2014-07-13 08:22:43
【问题描述】:
某些数据的副本不属于堆(没有特殊处理)。例如,堆栈上的JavaScriptValue 结构在与 Chakra JavaScript 引擎的互操作方面做得很好。
但据我了解,将这样的值存储在托管堆上(没有正确的引用计数)会导致可能的悬空引用。有没有办法将这样的 c# 结构声明为不可装箱?
澄清,如果对类型生成任何装箱操作,我希望 c# 编译器生成错误消息。
参考:见MSDN JSAddRef reference 上面写着:
这只需要在 不会被存储的 JsRef 句柄上调用 堆栈中的某处。 调用 JsAddRef 可确保 JsRef 引用的对象 > 在调用 JsRelease 之前不会释放 to。
据我推测,Chakra 可能正在使用“保守的垃圾回收”方法,使得基于堆栈的 JsRef 句柄不需要 JsAddRef/JsRelease。 我想使用一个类(而不是结构) 将 JsRef 句柄包装在堆上,并进行转换操作调用 JsAddRef,并使用 IDisposable 模式调用 JsRelease。
【问题讨论】:
-
它可以像局部变量一样轻松悬挂。 all 使用中需要正确的引用计数。