繁体   English   中英

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

[英]Do I need to dispose of SWIG-generated objects?

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

那么,对于“平均” SWIG 对象,我是否需要处理它? 似乎它们都有默认的析构函数,可以删除底层 C++ 中的对象。 如果是这种情况,那么我是否可以将它们视为任何其他对象并让垃圾收集器处理它们(除非会阻止垃圾收集器正确处理它们的事情,例如循环引用和其他经典内存泄漏)。 必须使用某种处理上下文或其他方式将所有调用/对象包装到此库中,这很糟糕。

鉴于评论中的答案,似乎在我的情况下总体上没有必要。 SWIG 生成了调用 dispose 函数的适当终结器。 有可能在 SWIG 定义中对 dispose 函数的定义不正确,但如果是这种情况,那么手动处置无论如何都无济于事。

编辑:虽然最初断言不需要处理对象,但在某些情况下它可能有用。

考虑您有一个通过 SWIG 公开的列表对象的情况: List此外,您有一个由列表拥有的“项目”对象: Item

如果你要这样做:

List list = new List(1, 2, 3);
Item item = list.Get(1);
// list is now available for garbage collection, as there are no longer any P/invokes nor 
// references to it
item.GetValue(); // Can possibly throw AccessViolationException if list
                 // has been garbage collected based on how it cleans up its items.

为了防止这种情况发生,你必须阻止list被敲定/布置,直到毕竟他们的item s的完成被使用。 这可以通过以下几种方式完成:

  • item的所有使用结束时使用GC.KeepAlive() 例如

    item.GetValue();

    GC.KeepAlive(list);

  • 利用IDisposable模式确保父对象的确定性处置。 例如

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM