On Fri, Oct 30, 2009 at 3:46 PM, Scott Hess <sh...@chromium.org> wrote:
> > Just to be clear for those of us who are wobbly on C++, this is > because during the constructor or destructor, your object is of the > class in question, NOT of the class it will finally be, because in the > constructor the subclass has not been constructed, yet, and in the > destructor the subclass was already destructed. So calling to the > subclass virtual implementation would be bad. > > Scott Meyers says: http://www.artima.com/cppsource/nevercall.html > > Is there any way we could modify an object to assert that it can't > happen in development? Like scoped_vtable_killer declared in the > constructor and destructor which makes calling a virtual method on > that object fatal? > That's an intriguing idea. It seems like you could swap the real vtable ptr out on ctor/dtor entry, and replace it with a ptr to a poisoned vtable. This sounds like debug build stuff only. > > -scott > > > On Fri, Oct 30, 2009 at 3:12 PM, Jeremy Orlow <jor...@chromium.org> wrote: > > 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: chromium-dev@googlegroups.com View archives, change email options, or unsubscribe: http://groups.google.com/group/chromium-dev -~----------~----~----~----~------~----~------~--~---