Re: Derived destructor not being called
 
stanley_r_eisenberg@raytheon.com wrote:
I finished reading about smart pointers and they look like they'll
take care of the destructor problems but will bring in some lifetime
complications as they appear to be destroyed when they go out of
scope.
In my case, the main program creates the interface but then feeds it
back into the DLL where it is stored to be manupulated in the future
(hence my reason for using non-smart pointers). I think I have some
ideas that may get around this however.
Another question. It looks like smart pointers are able to somehow get
around the problem of not being to declare a destructor in IDL... is
this very complicated?
It's as simple as the example I already showed of how Release is typically 
implemented:
void __stdcall Release()
{
    ULONG count = ::InterlockedDecrement(&m_cRef);
    if (0 == count)
        delete this;
}
Since the 'delete this' is coming from within the class, there's no need to 
have a destructor declared on the interface.  Typically, Release is 
implemented on the most-derived classes, so the destructor doesn't even need 
to be virtual.  Often though, COM objects are built using some kind of 
framework (e.g. ATL), and such frameworks usually declare a virtual 
destructor at the top of the hierarchy just to make it easier to write 
correct code (and correspondingly harder to write flawed code)..
e.g.
class CUnknown
{
    protected:
        virtual ~CUnknown();
    // ...
};
class MyClass : public CUnknown, public IMyInterface
{
    // ...
    void __stdcall Release()
    {
        ULONG count = ::InterlockedDecrement(&m_cRef);
        if (0 == count)
            delete this;
    }
    // ...
};
Just curious as it may be possible to build this kind of functionality
into my own code... all I'm really going for is to have some way to
destroy the object when I'm done with it.
If ATL is too heavyweight for you, there's a useful lightweight COM 
framework in the DirectShow SDK.  It may take some digging to locate the 
necessary files and extract them, but AFIAK it's technically sample code and 
can be re-purposed however you see fit.
-cd