Re: CMAP under vs2005+
On Wed, 29 Oct 2008 15:46:47 -0400, Tommy <tommy767@gmail.com> wrote:
That means that you should never do:
[pseudocode]
CMapEx* pmex = new CMapEx;
std::map* pm = pmex;
...
delete pm; .. The dtor of CMapEx wont be called.
[/pseudocode]
Unless I misunderstand, I am not seeing this.
The dtor of CMapEx will be called, if one was created, just not the
base inherited std::map simply because there isn't one.
A class doesn't have to explicitly define a dtor in order to have an
implicit one. In any case, std::map certainly defines its dtor.
You do misunderstand. The statement "delete pm" is actually undefined,
because std::map does not have a virtual dtor, and it is undefined to
delete a pointer to such an object through any type other than the type
used in the new-expression, i.e. the static type of the object. The only
legal delete-expression given the above is "delete pmex". (More rigorously,
it could be any pointer equal to pmex with the type CMapEx*.)
In practice, when you say "delete pm" as above, std::map's dtor will be
called, but CMapEx's won't, but since this is undefined, anything at all
could happen.
And you can make the ~CMapEx virtual.
That does not help in the slightest.
template <typename VALUE>
class CMapEx : public std::map<CString, VALUE, __cbCStringCaseCmp>
{
public:
virtual ~CMapEx() { printf("-- IN CMAPEX DESTRUCTOR\n"); }
....
};
...
CMapEx<CString> *pSomeMap = new CMapEx<CString>;
delete pSomeMap;
You will see the virtual dtor of CMapEx called.
Well, yes, and it has nothing to do with the virtualness of CMapEx's dtor.
It has everything to do with deleting a pointer having the same static type
that was used in the new-expression. It will not fix the problem in the
statement "delete pm" above.
--
Doug Harrison
Visual C++ MVP