I've spent a good deal of this week trying to track down what turned out to
be a simple but fairly common problem: I forgot virtual dispatch only
partially works in destructors.  There have been several email threads about
this, but it still bites us form time to time, so I thought it was worth
another reminder.


Details:
I subclassed ChromeThread which subclasses base::Thread.  base::Thread calls
CleanUp on the thread right before termination.  CleanUp is virtual.  Both
ChromeThread and my class override CleanUp().  base::Thread calls Stop() in
its destructor to stop the thread (if it hasn't already been stopped).  But
by the time you hit destruction, the vtable is no longer available and thus
the destructor of base::Thread (and anything it calls) does NOT have access
to the vtable of ChromeThread (or my class).  So, if you don't explicitly
call Stop(), your subclass's CleanUp method will NOT be called.  Thus the
thread was going away without my CleanUp method ever being called.

Obviously this affects more than just base::Thread.  And this is also how
you can hit errors with pure virtual methods being called.

J

--~--~---------~--~----~------------~-------~--~----~
Chromium Developers mailing list: [email protected] 
View archives, change email options, or unsubscribe: 
    http://groups.google.com/group/chromium-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to