문제

나는 QScriptEngine 클래스의 오버로드된 클래스 생성자를 통과하고 있다는 것입니다. Evaluator 그리고 그것을 할당합니다 QScriptEngine *engine_ (수업 Property 서브클래스 Evaluator, 그리고 이 생성자를 호출합니다. Evaluator, 이미 할당된 값을 전달합니다. QScriptEngine).인수가 없는 생성자는 새 항목을 생성합니다. QScriptEngine 포인터(클래스 Generic 서브클래스 Evaluator 이런 식으로).소멸자에서 다음과 같은 경우 테스트합니다. engine_ 아니다 NULL, 포인터를 삭제한 다음 할당하세요. NULL.포인터(engine_) 파생된 Property 이제 또한 NULL?뭔가가 나에게 이것이 사실이 아니라고 말해줍니다.그렇지 않다면 이 상황을 어떻게 처리합니까?나는 필요하다 QScriptEngine 전체적으로 동일한 인스턴스가 되도록 합니다. QScriptEngine's = 연산자는 비공개입니다. 그렇지 않으면 포인터를 모두 피할 것입니다.

공유 포인터에 대한 정보를 보았습니다(boost::shared_ptr 그리고 std:tr1::shared_ptr) 다른 SO 질문에.나는 이미 정규식 라이브러리에 부스트를 사용하고 있으므로 이것이 이 문제를 처리하는 가장 좋은 방법이라면 부스트가 의심의 여지가 없습니다.일반적인 C++ 지식과 향후 프로젝트를 위한 비부스트 방식이 있기를 바랍니다.

도움이 되었습니까?

해결책

'getter' 메서드와 함께 해당 포인터의 수명 제어를 클래스(클래스 A) 중 하나에 제공하여 이 문제를 해결할 수 있습니다.다른 클래스(클래스 B)는 포인터가 필요할 때마다 항상 A의 getter를 호출합니다.이렇게 하면 A는 항상 포인터를 제어할 수 있습니다.단점은 getter 함수입니다(아마도 인라인이지만 여전히 두 번째 간접 참조입니다).또한 B는 거의 모든 사용에서 해당 포인터의 NULL을 확인해야 합니다.

다른 선택은 기본 포인터를 유지하고 해당 포인터를 공유하는 모든 객체가 삭제될 때만 삭제하여 문제를 해결하는 Boost::shared_ptr과 같은 것으로 포인터를 래핑하는 것입니다.직접 작성할 수도 있지만 이미 플레이 부스트가 있으므로 구현을 사용하겠습니다.

세 번째 선택은 공유 포인터가 필요하지 않도록 전체를 리팩토링하는 것입니다.저는 개인적으로 공유 포인터가 필요한 C++ 프로그램을 디자인하지 않을 것입니다. 단지 수년에 걸쳐 메모리 관리 버그가 쉽게 침입할 수 있는 지점이기 때문입니다. 하지만 그게 바로 저입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top