Reinhard Nissl wrote:
I've just got a pure virtual function call in cDevice::Action() for
receiver[i]->Receive(b, TS_SIZE);

cReceiver::~cReceiver() calls Detach(), but at that time, it is simply
too late as the virtual method table entry for Receive() has already
been restored to 0.

I suggest to call Detach() from cFemonReceiver::~cFemonReceiver() to fix
this issue.

Calling virtual functions from destructors is generally not a good idea. It works if the call is in the deepest nested destructor, but within a base class destructor, virtual functions are already being destructed and reverted to the base class. (here: to a pure virtual dummy)

The best method to avoid this is to do all cleanup involving virtual functions before destroying the object. If this is not possible, it also works to do the cleanup in EVERY derived class' destructor.

This is extremely nasty within a cThread, where you have to make sure that the thread got stopped _before_ the destructor gets called, or you risk to 'steal' the virtual functions from the running thread.



vdr mailing list

Reply via email to