2014-10-15 3 views
4

C++ 라이브러리에서 Java로 기능을 노출하는 동안 최근에 C++ shared_ptr 포인터 관련 문제가 발생했습니다. 이 경우 해당 객체와 관련된 객체뿐만 아니라 jlong 핸들도 Java 부분 만 있지만 이후 구조는 스마트 포인터를 사용하여 해당 객체에 액세스합니다.C++ shared_ptr 및 Java 기본 객체 소유권

내가 가진 문제는 다음과 같습니다. 스마트 포인터가 손상되거나 재설정되면 기본 개체가 삭제됩니다. 그러나 Java 참조 점은 여전히 ​​해당 객체를 가리 킵니다.

많은 노력을했지만 Java-Side에서 소유권을 유지 관리하지 못했습니다. 그 문제에 대한 모범 사례 또는 해결책이 있습니까?

답변

4

, 여기에 유용한 패턴 네이티브 객체의 라이프 사이클보다 오래 지속되기 때문에 자바가 MyObject의 릴리즈를 제어하기를 원하지 않는다면 std::weak_ptr으로 같은 트릭을 수행 할 수있다.

1

shared_ptr은 소유권을 관리하는 데 대해 정확히입니다. 자바 측에서 소유권을 관리하려면 shared_ptr을 실제로 사용하지 않을 것입니다.

해킹이있는 경우 이 아닌이 실제로 객체를 삭제하지 않는 shared_ptr을 사용자 정의 Deleter와 함께 사용할 수 있습니다.

+0

사실 그 전적으로 동의하지만, 나는 C++ 코드를 변경할 수는 없지만 Java 측만 변경할 수 있다고 말해야합니다. – fyr

0

스마트 포인터는 종종 할당/할당 해제와 관련이 있으며 shared_ptr도 예외는 아닙니다. 할당에 신경 쓰지 않고 객체에 대한 참조를 원하면 참조 나 포인터를 사용하십시오.

일반적인 포인터를 작업에 사용할 수없는 특별한 이유가 있습니까? 당신이 자바 참조가 잘못 될 수 있음을 우려하는 경우, 다른 한편으로

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(); 
} 

: 당신이 한 자바 그것에 대한 참조를 유지으로 개체를 유지하려면

+0

이유는 기본 라이브러리를 변경할 수 없다는 것입니다. – fyr