我是否需要处理SWIG生成的对象?

时间:2017-05-18 18:13:14

标签: c# swig idisposable

我目前正在使用从SWIG构建到.NET的库。该库的文档似乎没有提供有关是否需要处理所创建的类或什么类的信息。我还在其他论坛上看到了有关需要添加代码来处理子元素的讨论,这些元素我在这个库的源代码中看不到。最重要的是,库的示例项目和测试不包括using,也不会处理它们创建的对象。

所以,对于平均水平的' SWIG对象,我需要处理它吗?它们似乎都有默认的析构函数,它们删除底层C ++中的对象。如果是这种情况,那么我可以将它们视为任何其他对象并让垃圾收集器处理它们(禁止垃圾收集器正确处理它们的事情,如循环引用和其他经典内存泄漏)。不得不用一些处理上下文或其他东西将所有调用/对象包装到这个库中。

1 个答案:

答案 0 :(得分:0)

鉴于评论中的答案,似乎在我的案例中总体上没有必要。 SWIG生成了适当的终结器,称为dispose功能。在SWIG定义中可能没有正确定义dispose函数,但如果是这种情况,则无论如何手动处理都无济于事。

编辑:虽然没有必要处理对象的初始断言,但有一种情况可能有用。

考虑通过SWIG公开集合对象的情况:Collection 此外,您还拥有该集合所拥有的“item”对象:Item

如果你这样做: Collection collection = new Collection(1, 2, 3); Item item = collection.Get(1); // c is now available for collection, as there are no longer any P/invokes nor references to it item.GetValue(); // Can possibly throw AccessViolationException if collection has been collected // based on how it cleans up its items.

为了防止这种情况发生,您必须阻止collection完成/处置,直到 所有item完成后才会使用。这可以通过以下几种方式完成:

  • GC.KeepAlive() s的所有用法结束时使用item。 E.g。

    item.GetValue();

    GC.KeepAlive(collection);

  • 利用IDisposable模式确保父对象的确定性处理。 E.g。

using(Collection collection = new Collection(1, 2, 3)) { Item item = collection.Get(1); item.GetValue(); }

因此,手动处理或使用IDisposable模式本身并不是必需的,但确保您对非托管对象的使用是安全,一致和清晰的是有用的