gpt4 book ai didi

java - C++ shared_ptr 和 Java native 对象所有权

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:05 24 4
gpt4 key购买 nike

在向 Java 公开 C++ 库的功能时,我最近遇到了一个关于 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 引用可能会因为它超过 native 对象的生命周期而变得无效,但又不想让 Java 控制 MyObject 的释放,您可以使用 std::weak_ptr.

关于java - C++ shared_ptr 和 Java native 对象所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com