문제
나는 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++ 프로그램을 디자인하지 않을 것입니다. 단지 수년에 걸쳐 메모리 관리 버그가 쉽게 침입할 수 있는 지점이기 때문입니다. 하지만 그게 바로 저입니다.