2014-12-11 2 views
0

포인터의 내용이 삭제되었는지 어떻게 확인할 수 있습니까? 나는이 같은 QPointer를 사용하는 경우 :QPointer를 사용하는 수정 된 방법입니까?

myClass::myClass(myStruct* p){ 
_p = p;//_p is a QPointer<myStruct> 
} 

myClass::function(){ 
if(_p) {_p->function();} 
} 

을 나는 마지막 A.function()는 _p-> 기능을 cuase합니다

myStruct* p = new myStruct(); 
myClass A(p); 
delete p; 
A.function(); 

가지고()를 호출하기 때문에 액세스 위반이 발생할 수? p를 삭제하면 _p는 어떻게됩니까?

+1

확인 볼 수있는 방법이 없다'QSharedPointer'와'QWeakPointer' – dtech

+0

그러나 QPointer의 문서가 삭제되면 0으로 캐스팅 될 것이라고? – Nyaruko

+1

@ddriver 내가 너를 잘못 읽니? 'QObject' 소멸자는 그것을 가르키는'QPointer'를 모두 지 웁니다. – hyde

답변

2

myStructQObject 인 경우 표시된 코드에서 알 수 있듯이 코드가 작동해야합니다. QObject 소멸자는 파괴 된 인스턴스를 가리키는 모든 QPointer을 지울 것입니다. QObject 하위 클래스가 아니라면 컴파일/링크 오류가 발생합니다. docs에서

인용구 :

참고 클래스의 T는 QObject를 상속해야하며, 컴파일 또는 링크 오류 가 발생합니다. 일반 포인터와

+0

그러나 QPointer가 언제 다시 NULL로 설정 되었습니까? delete p가 호출되면 즉시 NULL로 다시 설정됩니까 (삭제 p와 QPointer가 같은 스레드에 있다고 가정)? myClass :: function()을 트리거하는 신호를 내보내는 또 다른 스레드가 있다면 내 질문에있는 예제가 여전히 안전할까요? – Nyaruko

+1

가비지 콜렉션이없는 C++에서'delete'는 객체 소멸자가 역순으로 즉시 호출되게하므로'QObject :: ~ QObject'는 호출 될 마지막 소멸자이지만'delete ' "를 반환합니다. 스레드 간 신호를 사용하는 경우 대기열에 있어야하므로 개체를 삭제해도 문제가 발생하지 않습니다. – hyde

+1

@Nyaruko 삭제되는 동안 다른 스레드에서 삭제되는 개체의 메서드를 호출하면 (직접 명시 적으로 스레드로부터 안전하지 않은 다른 작업을 수행하는 경우) 직접 메서드 호출이거나 'Qt :: DirectConnection'신호를 통해 수행됩니다. 이것은 기본적으로 프로그램의 버그입니다. – hyde

관련 문제