C ++ shared_ptr和Java本机对象所有权

问题描述 投票:4回答:3

虽然将功能从C ++库公开给Java,但我最近遇到了有关C ++ shared_ptr指针的问题。这种情况是对象本身以及与该对象相关的jlong处理都位于Java部分中,但随后的结构使用智能指针访问该对象。

我得到的问题是:当智能指针被破坏或重置时,基础对象也将被删除。但是,Java参考仍然指向该对象。

我做了很多尝试,但是我没有设法在Java方面保留所有权。是否有针对该问题的最佳实践或解决方案?

java c++11 java-native-interface shared-ptr
3个回答
5
投票

如果您想保留对象,只要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执行相同的技巧。


1
投票

shared_ptr是完全关于所有权管理。如果您想在Java端管理所有权,我实际上不会使用shared_ptr。

作为一种破解,您可以将shared_ptr与自定义Deleter结合使用,它实际上<< [not删除对象。


0
投票
智能指针通常与分配/取消分配有关,shared_ptr也不例外。如果要引用对象而不关心分配,请使用引用或指针。

是否有特定原因,您不能在任务中使用普通指针?

© www.soinside.com 2019 - 2024. All rights reserved.