2013-02-19 2 views
3

-std = C++ 0x를 사용하여 Eclipse/gcc를 사용하여 우분투에서 개발하기.큐로 객체 조각 내기

개체 조각화에 문제가있는 것으로 보입니다. 여기서는 다른 질문에 해당하지 않습니다. 매우 간단한 기본 클래스/자식 클래스 상속 모델이 있습니다.

class Parent{ 
public: 
    Parent(); 
    virtual ~Parent(); 
    virtual void DoStuff() = 0; 
}; 

class Child : public Parent{ 
public: 
    Child(); 
    virtual ~Child(); 
    virtual void DoStuff(); //Child can have "grandchildren" 
}; 

내가 원하는 것은 내가 작업자 스레드에 의해 처리를 위해 이러한 개체를 저장할 수있는 큐를하는 것입니다 : 기본 클래스는 분명 아이가 구현 한 순수 가상 함수가 있습니다. 나는 포인터를 저장해야한다는 것을 알고있다. 그렇지 않으면 슬라이싱을 보장 할 수있다. 그래서,이 작업을 수행하는 클래스 ("프로세서")에서 내가 가진 :

typedef queue<Parent*> MYQUEUE; //#include <queue> 
static MYQUEUE myQueue; 

//Call this after creating "Child c;" and passing in &c: 
void Processor::Enqueue(Parent* p) 
{ 
    myQueue.push(p); 
} 

void* Process(void* args) //function that becomes the worker thread 
{ 
    while(true) 
    { 
     if(!myQueue.empty()) 
     { 
      Parent* p = myQueue.front(); 
      p->DoStuff(); 
      myQueue.pop(); 
     } 
    } 
    return 0; 
} 

무엇 다음 발생하면 상속/다형성이 작동하지 않는 것처럼 프로그램이 충돌은, "순수 가상 메서드가 호출"말하는 것입니다 바르게. 나는 내가 시험 할 때 이것이 제대로 작동했기 때문에 상속이 올바르게 설정되었음을 안다 :

어떤 지침도 크게 감사하겠습니다!

+1

디버거를 사용 해보았습니까? –

답변

2

개체를 작업자 스레드에 전달하는 경우 개체를 스택에 만들 수 없습니다. 작업자 스레드가 호출 할 때까지는 상위 스레드가 해당 함수를 떠났을 가능성이 있으며 개체를 파괴했습니다. 부모 스레드에서 동적으로 (아마도 new 경유로) 할당하고 작업을 완료 한 후에는 작업자 스레드에서 해제 (delete)해야합니다.

또 다른 참고 사항으로, 작업자가 실행되는 동안 부모가 작업을 대기열에 추가 할 수 있으면 대기열 액세스를 잠그는 것이 좋습니다.

+0

맞습니다 - 이전 코드를 리팩토링 할 때 메모리가 "new'd"가 아닌 것을 알지 못했습니다. 그리고 예, 대기열 주변의 액세스를 제어하는 ​​것이 내 목록의 다음 작업입니다. – dcdunne

0

이 오류는 호출 시점에 p이 가리키는 개체에 Parent 유형이 있음을 의미합니다. 그 방법은 당신이 보여주지 않은 코드에 달려 있습니다.

관련 문제