2011-09-02 4 views
-1

, 하나는 내가 다음 테스트 코드에서 두 클래스를 넣어이상한 행동 내가이 개 수업을

class OKClass 
{ 
public: 
    void PrintTest() { 
     std::cout << "print from OK class " << std::endl; 
    } 
}; 

class CrashClass 
{ 
public: 
    virtual void PrintTest() { 
     std::cout << "print from virtual Crash class " << std::endl; 
    } 
}; 

가상 기능이 CrashClass는 ) (때 호출 FUNC 충돌 OkClass는 "OK 클래스에서 인쇄"라는 단어를 인쇄합니다. 왜냐하면 shared_ptr 테스트는 범위를 벗어 났을 때 릴리스되었습니다. 왜이 이상한 일이 일어 났는지 나에게 설명 할 수 있니?

정보의 부족에 대한

boost::function0<void> func; 
{ 
    boost::shared_ptr<CrashClass> test(new CrashClass); 
    func = boost::bind(&CrashClass::PrintTest, boost::bind(&CrashClass::wptr::lock, CrashClass::wptr(test))); 
} 
func(); 

SRY 감사합니다 내가 왜 일류 작품 이유를 알고 있고, 두 번째는

추락하고 내가 가진

typedef boost::weaked_ptr<CrashClass> wptr 

Functor를 사용하여이 문제를 해결하십시오.

감사합니다. 어쨌든

+10

당신은 당신보다 많은 코드를 붙여 넣어야합니다. 'wptr'은 무엇입니까? –

+0

Chris Jester-Young이 지적한대로 코드가 누락되어 wptr 항목이 무엇인지 알 수 없습니다. 그러나 PrintTest의 첫 번째 인수에 함수 객체를 바인딩하고 있지만 PrintTest는 멤버 메서드이며 첫 번째 인수는 클래스의 인스턴스에 바인딩되어야한다고 말할 수 있습니다. wptr :: lock이 인스턴스를 반환하는 함수 인 경우이 작업을 수행하려면 더 많은 작업이 필요하지만 그 시점에서 추측하고 실제로 대답이 아닙니다. – ex0du5

+0

등록되지 않은 계정을 병합했습니다. 이제 질문을 다시 편집하고받은 답변 아래에 의견을 남길 수 있습니다. –

답변

0

wptr이 무엇인지 모르면 테스트가 범위를 벗어날 때 CrashClass의 인스턴스가 삭제되고있는 것만 추측 할 수 있습니다. 이 경우 충돌을 방지하기 위해 중괄호를 제거 할 수 있어야합니다. "지연"은 "예방"보다 더 정확하지만

0

boost::weak_ptr은 그것이 가리키는 메모리가 고정됩니다. 그것은 수업의 핵심입니다. 전화를 걸기 전에 (shared_ptr) 및 () 테스트 포인터를 잠그는 것은 해당 책임입니다. 그렇지 않으면 weak_ptr을 잘못 사용하고 있습니다.