虽然将功能从C ++库公开给Java,但我最近遇到了有关C ++ shared_ptr
指针的问题。这种情况是对象本身以及与该对象相关的jlong
处理都位于Java部分中,但随后的结构使用智能指针访问该对象。
我得到的问题是:当智能指针被破坏或重置时,基础对象也将被删除。但是,Java参考仍然指向该对象。
我做了很多尝试,但是我没有设法在Java方面保留所有权。是否有针对该问题的最佳实践或解决方案?
如果您想保留对象,只要Java保持对它的引用,这就是有用的模式:
jlong Java_xxx_getNativeRef(...)
{
std::shared_ptr<MyObject> *pNew = new std::shared_ptr<MyObject>;
*pNew = whatever-you-do to obtain an std::shared_ptr<MyObject>;
return reinterpret_cast<jlong>(pNew);
}
Java_xxx_releaseNativeRef(..., jlong nativeRef)
{
std::shared_ptr<MyObject> *pSp = reinterpret_cast<std::shared_ptr<MyObject> *>(nativeRef);
delete *pSp;
delete pSp; // thanks @LucasZanella
}
另一方面,如果您担心Java引用可能因为它超出了本机对象的生命周期而变得无效,但又不希望Java控制MyObject的发布,则可以使用std::weak_ptr
执行相同的技巧。
shared_ptr是完全关于所有权管理。如果您想在Java端管理所有权,我实际上不会使用shared_ptr。
作为一种破解,您可以将shared_ptr与自定义Deleter结合使用,它实际上<< [not删除对象。
是否有特定原因,您不能在任务中使用普通指针?