2017-10-09 9 views
0

나는 이라는 QObject 하위 클래스 (QML로 등록 됨)와 C++에서 정의한 QML 싱글 톤 (MySingleton)을 가지고 있습니다. 내가 QML에서 get_toReturn를 호출 할 때 나중에 반환 된 객체에() 파괴 호출하기위한 책임이,C++에서 QML로 반환되는 QObject의 수명은 어떻게 관리됩니까?

Q_INVOKABLE ToReturn* get_toReturn() { 
    return new ToReturn(); 
} 

: 후자는이 기능을 제공합니다? 아니면 자동 메모리 관리를 사용하는 방법이 있습니까?

내 ToReturn 개체는 논리적으로 개체 트리에 속해 있지 않으므로 nullptr을 부모 생성자 (QObject)에 전달합니다.

답변

1

자동으로 작동하는 것으로 간주되며 범위를 벗어나 개체가 삭제되고 부모는없고 참조가없는 것으로 가정됩니다.

  • 객체가 거의 즉시 위의 조건이 충족 파괴되지 않습니다 :

    말했다되고 그건

    는 2 가지주의 사항이있다. 더 복잡한 시나리오에서는 가비지 수집이 강제로 수행되지 않는 한 꽤 오래 머물러 있습니다. 부모와 참조가 있어도 객체는 삭제됩니다. 불행히도 제로 작업으로 거의 2 년 동안 서 있었던 critical bug입니다. 이 개체는 단순히

는 기본적으로 개체는하지 않는 QQmlEngine::JavaScriptOwnership있을 것이다 함수에서 반환 된 응용 프로그램이 충돌하는, 실종되지 않는 명시 적으로 단지 있도록 CPP 소유권을 설정, 수동 개체 수명 관리를 사용하라고 강요했다

QQmlEngine::setObjectOwnership(objectptr, QQmlEngine::CppOwnership); 

편집 : 명시 적으로 통해 그렇지 않으면 설정 조기 삭제가 완전히 QML 선언하고 생성 된 개체는 또한이 적용됩니다, 그래서 JS 소유권과 관련이 있습니다. 그러한 객체에 대해 CPP 소유권을 설정하여 객체를 보호 할 수 있으며 이러한 객체의 삭제는 C++에서만 가능하며 deleteLater()을 사용하는 것이 좋습니다.

+0

감사합니다. 동일한 문서를 발견했습니다. 그러나 나는 반환 된'QQmlListProperty '(그것의 포함 된 항목들)의 소유권을 정의하는 곳을 찾을 수 없다. 나는 QQmlListProperty를 ToReturns의 부모로 만들 수 있다고 생각한다. –