2013-01-05 2 views
1

이전에 boost :: bind 함수를 변수에 저장하여 나중에 필요할 때 함수를 호출 할 수있었습니다.내부 클래스에 boost :: bind 함수를 전달하는 중 오류가 발생했습니다.

//Caller, note the Accepthandler function is specified here 
mysocket->RegisterAcceptHandler(boost::bind(&AcceptHandler,_1,_2)); 

//Registration function, a member of the socket class. cnctCallBack is a typedef to a boost:function 
void mynamespace::socket::RegisterAcceptHandler(const cnctCallBack &cb) 
{ 
    connectCallBack = cb; 
} 

을하고 적절한 인수와 함께 원하는대로 connectCallBack 전화 : 그것은 매우 간단합니다, 당신은 단순히 같은 것을 할.

내 문제는 이제 처리기가 내부 멤버 개체에서 함수를 등록하도록하려는 것입니다. 다시 말해 소켓은 더 이상 콜백을 호출하지 않지만 내부 클래스는 콜백에 대해 알리고 호출합니다. 당신은 당신이 단순히 내부 클래스에서 함수에 & CB를 할당 할 수 있다고 생각 싶지만, 그렇게 될하지 밝혀 : 나는 outerclass을 실행할 때

typedef boost::function<void()> recCB; 

class InnerClass{ 

public: 
    void AttachListener(const recCB &rcb); 
    void RunListener(); 

private: 
    boost::function<void()> callback; 
}; 
void InnerClass::AttachListener(const boost::function<void()> &rcb) 
{ 
    callback = rcb; 
} 

void InnerClass::RunListener() 
{ 
    callback(); 
} 

class OuterClass{ 

public: 
    void AttachListener(const boost::function<void()> &rcb); 
    void RunListener(); 

private: 
    InnerClass * ic; 
    boost::function<void()> cb; 
}; 

void OuterClass::AttachListener(const boost::function<void()> &rcb) 
{ 
    cb = rcb; 
    ic->AttachListener(rcb); 
} 

void OuterClass::RunListener() 
{ 
    cb(); 
    ic->RunListener(); 
} 

이 밝혀과 기능을 할당하려고 OuterClass.AttachListener를 사용하면 0xfffff ...에서 액세스 위반이 발생합니다. 이는 상당히 눈에 띄는 주소입니다. 호출 스택을 살펴보면 할당 연산자에 대한 문제가 문제의 원인이지만 문제가 무엇인지 알 수 없습니다. 외부 클래스의 변수에 할당 할 때 동일한 할당 코드가 작동하는지 확인하기는 쉽습니다. 당신이 한 수준에서만 이것을 할 수 있다는 것을 의미하는 * 것에 대해 뭔가가 있는지 궁금합니다.

답변

1
void OuterClass::AttachListener(const boost::function<void()> &rcb) 
{ 
    cb = rcb; 
    ic->AttachListener(rcb); //<------the problem is here 
} 

는 포인터이며 어디에도 메모리가 할당되어 있지 않습니다. 그래서 런타임에 액세스 위반 오류가 발생합니다.

글쎄, 그건 당신이 가서 메모리를 할당한다는 의미는 아닙니다.

InnerClass ic; //it is a non-pointer member now 

포인터가 아닌 구성원 인, 그리고로 사용 : 나는 오히려 다음과 같이 ic를 선언 제안 훨씬 더 그

void OuterClass::AttachListener(const boost::function<void()> &rcb) 
{ 
    cb = rcb; 
    ic.AttachListener(rcb); 
} 

.

+1

오 주여, 나는 생각하지 못했습니다. 그것은 단순한 ic = 새로운 InnerClass()로 작동합니다. 나는 침대가 서서히 지쳐 있다고 느낍니다. – Carlos

+1

@ 카를로스 : 그러나 그렇게하지 마십시오. 당신이 * 포인터를 정말로 필요로하지 않는 한, 내 대답에서 제안한대로해라.이 경우에 당신은 당신의 필요에 맞는'std :: unique_ptr' 또는'std :: shared_ptr'를 사용해야한다. – Nawaz

+0

예, 공유 포인터 등으로 아이디어를 이해합니다. 아마도 메모리 누수의 가능성을 허용하지 않는 것이 가장 좋습니다. 나는 방금 정확히 무엇이 파괴되고 있는지보기 위해 테스트 케이스를 만들었다. – Carlos

관련 문제