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

Rare segmentation fault during object creation with new

在 Java 应用程序中,我使用 JNI 调用几个 C++ 方法。其中一个方法创建了一个对象,该对象必须在该方法完成后保留并在其他方法调用中使用。为此,我创建了一个对象的指针,我将return指向Java作为以后访问的参考(注:Javaclass实现了Closable 并且在 close 方法中,我调用了一个删除对象的方法)。

但是,在极少数情况下,大约在 50.000 次调用之后,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在多线程中必须保护以避免不可恢复的崩溃。