【发布时间】:2017-05-18 18:13:14
【问题描述】:
我目前正在使用从 SWIG 构建到 .NET 的库。该库的文档似乎没有提供有关是否需要处理或需要处理哪些类的任何信息。我还在其他论坛上看到了关于需要添加代码来处理我在这个库的源代码中没有看到的子元素的讨论。除此之外,该库的示例项目和测试不包括usings,也不释放它们创建的对象。
那么,对于“平均”SWIG 对象,我是否需要处理它?似乎它们都有默认的析构函数,可以删除底层 C++ 中的对象。如果是这种情况,那么我是否可以将它们视为任何其他对象并让垃圾收集器处理它们(禁止阻止垃圾收集器正确处理它们的事情,例如循环引用和其他经典内存泄漏)。不得不用某种处置上下文或其他东西将所有调用/对象包装到这个库中,这很糟糕。
【问题讨论】:
-
循环引用不会阻止对象被丢弃。
-
SWIG 是否向 c# 对象添加了终结器?如果没有,您可能会发生内存泄漏,因为 GC 不能保证在所有情况下都会调用 Dispose。
-
这取决于如何使用 SWIG 创建包装器。包装对象有很多可能性,您需要手动处理。同时正如@JoelLucsy 解释的那样,可以制作包装器,使生成的代码包含终结器,从而确保正确的 gc。
-
@Servy 循环引用防止对象被终结,并且 SWIG 添加了终结器来处理。
-
@NateDiamond - 循环引用不会阻止对象被终结(和释放),它们延迟对象被终结。无论如何,一旦一个对象无法从所有 GC 根中访问,它最终将被最终确定并 GC'd。唯一的例外是当您通过在终结器中执行一些愚蠢的操作(例如尝试获取锁)来死锁终结器线程时。
标签: c# swig idisposable