Нарезка объектов с очередями

Разработка в Ubuntu с использованием Eclipse / gcc с -std = c ++ 0x.

Кажется, у меня есть проблема с нарезкой объектов, которая не подпадает под другие вопросы, которые я видел здесь. У меня очень простая модель наследования базового класса / дочернего класса. Базовый класс имеет одну чисто виртуальную функцию, которую, очевидно, реализует дочерний элемент:

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;
}

Затем происходит сбой программы, которая называется «вызван чисто виртуальный метод», как будто наследование / полиморфизм работает неправильно. Я знаю, что наследование настроено правильно, потому что во время тестирования я подтвердил, что это работает:

Child c;
Parent* p = &c;
p->DoStuff();

Любое руководство с благодарностью!

3

Решение

Если вы передаете объект в рабочий поток, вы не можете создать его в стеке. К тому времени, когда рабочий поток вызывает его, родительский поток, вероятно, покинул эту функцию и уничтожил объект. Вы должны динамически распределять (возможно, через new) это в родительском потоке и только бесплатно (delete) это в рабочем потоке после того, как вы закончите с этим.

Еще одно замечание: вам нужно заблокировать доступ к очереди, если родитель может ставить в очередь задание во время работы работника.

2

Другие решения

Ошибка означает, что объект, на который указывает p в точке вызова имеет тип Parent, Как это получилось, зависит от кода, который вы не показали.

0

По вопросам рекламы [email protected]