다음 예를 들어 보겠습니다. 자식 창을 가질 수있는 창 클래스가 있다고 가정 해보십시오. 각 자식 창은 부모 창에 약한 포인터를 보유하고 있으며, 각 창에는 자식에 대한 공유 ptrs 목록이 있습니다. 이제는 자식 창이 destructed 경우 부모 창이 닫혀 있기 때문에 destructed 경우 또는 자식 창 자체가 닫혀 있기 때문에 내가 알 수없는 상황이 있습니다. 이에C++ : 예외적 인 상황에서 예외를 사용하는 이유가 있습니까?
//we try to retain the parent window here
try
{
//creates a shared pointer from the weak pointer, throws BadReferenceCounterException on fail
WindowPtr parent = m_parentWindow.retain();
//check if there is a parent at all, otherwise 0
if(parent)
{
parent->removeChildWindow(this);
}
}
catch(const BadReferenceCounterException & _ec)
{
std::cout<<"Catched expected exception, if Parent was closed before me!"<<std::endl;
}
: 그러므로 내가 생각 해낸 해결책은 시도 {} 캐치에서 자식 창 소멸자에서 부모 창 약한 포인터 역 참조 {} 부모 윈도우는 여전히 (의사) 존재하는지 차단했다 상황 소멸자가 호출 된 문맥을 알 수있는 방법이 없기 때문에이 문제를 해결하는 또 다른 방법을 생각할 수 없습니다. 일종의 예상 상황에서 예외를 사용하기 때문에 이렇게하는 것은 어리석은 짓입니까? 성능에 중요한 코드에서 수행하려는 작업이 아니라는 것을 알고 있습니다. 따라서이 질문의 핵심은 아닙니다.
감사합니다.
사운드에 제시 한 코드 샘플을 체크 아웃 할 수 있습니다
: 표준 (모두 C++ 11에서 부스트에서) 공유/약한 포인터는 예외없이 할 수 있도록 거룩한 전쟁 영토처럼 나에게. 첫 발리슛을 드리겠습니다. 당신의 약한 포인터는 던지지 않고 유효성을 검사 할 수 있습니다. 'boost :: weak_ptr :: lock'은 그러한 접근에 대해 null boost :: shared_ptr를 반환합니다. – Managu
@moka : "유효한"의미는 무엇입니까? –
원하는대로 작동합니까? 충분히 잘 수행? 이해할 수 있니? 그런 다음 유효한 해결책 인 IMHO입니다. – Managu