|
How To Not Overwrite Your vTable
Submitted by |
Often when a class has a lot of members that just need to be zero at
construction time I use the following code in the constructor.
CSomeClass::CSomeClass()
{
memset( this, 0, sizeof( CSomeClass ) );
} |
This is perfectly legal, fast for large classes and looks not that stupid at
all. But the fun hasn't even started yet. Consider the following class.
class CSomeOtherClass
{
CSomeOtherClass( void );
virtual SomeMethod( void );
} |
This class has a virtual method which means that it will contain a vTable. This
vTable is created at construction time right before the body of the constructor
is entered. Now consider the following constructor implementation.
CSomeOtherClass::CSomeOtherClass()
{
memset( this, 0, sizeof( CSomeOtherClass ) );
} |
You've just set your vTable to nothing but zeroes. Which means calling
SomeMethod() will result in an access violation. Ain't that sweet. It took me
actually about 30 minutes, a visit to #flipcode and some thinking to figure out
this was happening (since I was using memsets happily for years). If you still
want to use memset by the way you could put all your members in a struct and
memset that struct (Thanks DoomWiz and Foper). But who would wanna do that :).
Anyway, the #flipcode people told me I should TOTD this so here you go. See you
all later, and yeah I know I'm a cheap jeep.
Jaap Suter
|
The zip file viewer built into the Developer Toolbox made use
of the zlib library, as well as the zlibdll source additions.
|