我有大量的C ++代码,我已经用SWIG包装并从Java调用它。 C ++代码可以自由使用boost智能指针。
我的一些JUnit测试已完成,但在清理过程中遇到了seg故障。堆栈跟踪指示对象的最终化中的内存错误,但它发生在SWIG生成的JNI代码中,并且似乎与智能指针引用计数相关联。
我希望能够遍历代码的所有层。这可能吗?我也很高兴听到别人对这类问题的经历。
答案 0 :(得分:1)
您可以将第二个本机代码调试器附加到正在执行的Java代码中。例如,使用Visual Studio,您可以通过“Debug> Attach to process。”进行附加。
SWIG支持智能指针,但您必须在Java端明确管理其生命周期。如果您在Java端获得智能指针对象的所有权,则必须将其删除。请记住,Java没有超出范围的对象临时值,因此您将无法使用像f()。g()。h()这样的表达式,其中每个级别的返回值都是智能指针。
作为故障保护,如果发生垃圾收集,SWIG生成的终结器将尝试为您删除它。如果在C ++端已经删除了该对象,那故障安全将是有害的。