使用new创建对象时出现罕见的分割错误



在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以避免不可恢复的崩溃。

相关内容

  • 没有找到相关文章

最新更新