分割错误调用SWIG生成Getter

Segmentation Fault calling SWIG Generated Getter

本文关键字:生成 Getter SWIG 调用 错误 分割      更新时间:2023-10-16

我正在使用SWIG包装一组用c++编写的内部库,以提供对Java API的访问,到目前为止我还没有遇到任何问题。

我有一个结构体,它被包装到Java代理类及其相关的getter和setter中。生成的代码实际上可以工作一段时间。然而,在Java中调用了足够多的getter之后,就会出现分段错误,导致JVM崩溃。我在for-each循环中调用getter。例如:

for( NativeProxyClass t : ContainerOfNativeProxyClasses )
{
    if( t.getSomeField() == 1 ) /// Segfault occurs in the native code corresponding with this getter only sometimes.
    {
        /// Do something with t.
    }
}

我知道这可能是模糊的,但我不能发布确切的代码。就像我说的,这是一个奇怪的问题,因为它并不总是在固定的时间后发生,有时需要几秒钟,有时会立即发生。我不认为对象正在被删除,因为我在代理类的终结器delete函数中添加了print语句。

感谢您的帮助

我找到我的问题了。我正在使用SWIG的std_vector实现。我在封装的std::vector中返回数据,当vector超出Java端的作用域时,垃圾收集器调用finalize方法,最终删除数据。基本上,我做了一个肤浅的复制。添加复制构造函数修复了这个问题。