在将功能从C ++库暴露给Java时,我最近遇到了关于C ++ shared_ptr
指针的问题。这种情况是,Object本身以及与该Object相关的jlong
句柄都存在于Java部分中,但后续结构使用智能指针访问该Object。
我得到的问题是:当智能指针被破坏或重置时,底层对象也会被删除。但是Java引用仍指向该Object。
我尝试了很多,但我没有设法保持Java端的所有权。是否有针对该问题的最佳实践或解决方案?
答案 0 :(得分:4)
如果你想保留对象,只要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);
pSp->clear();
}
另一方面,如果您担心Java引用可能因为它超过本机对象的生命周期而变得无效,但是不希望Java控制MyObject的发布,那么您可以使用相同的技巧std::weak_ptr
。
答案 1 :(得分:1)
shared_ptr 完全关于管理所有权。如果你想管理java方面的所有权,我实际上不会使用shared_ptr。
作为一个黑客,你可以将shared_ptr与自定义删除器一起使用,不实际上删除对象。
答案 2 :(得分:0)
智能指针通常与分配/释放有关,而shared_ptr也不例外。如果想要引用对象而不关心分配,请使用引用或指针。
您是否有特定原因无法使用普通指针执行任务?