在Java应用程序中,我使用JNI来调用几个C++方法。其中一个方法创建了一个对象,该对象必须在方法完成后保持,并在其他方法调用中使用。为此,我创建了一个对象的指针,并将其返回Java作为以后访问的引用(注意:Java类实现Closable
,在close
方法中,我调用一个方法来删除对象(。
然而,在极少数情况下,大约在50000次调用之后,C++代码会抛出分段错误。根据日志文件的内容,只有几行代码是可疑的错误源(它们位于上次打印的日志消息和下一条消息之间(:
MyObject* handle = new MyObject(some_vector, shared_ptr1, shared_ptr2);
handles.insert(handle); // handles is a std::set
jlong handleId = (jlong) handle;
我想知道,除了我使用老式的C指针之外,这里是否存在可能的问题。多线程可能是个问题吗?或者指针ID在转换为jlong
时会被截断吗?
我还想指出的是,根据我之前的经验,我知道日志只是分段故障发生位置的粗略指标。它也可能发生在代码的后面,而下一条日志消息根本还没有打印出来。然而,重现这个错误可能需要1-2天,所以我想看看这些行是否有问题。
从代码中删除std::set
后,错误不再发生。结论:必须保护多线程中的std::set
以避免不可恢复的崩溃。