Re: Making a smart pointer which works with incomplete types
Lance Diduck wrote:
There has been a long standing feature in C++ called "virtual
desstructor" that exacly solves this problem in this same way.i.e.
struct Incomplete{
virtual void foo()=0;
virtual ~Incomplete(){}
};
struct Complete:Incomplete{
void foo(){}
};
Incomplete * i=new Complete;
delete i;//does not require Complete type
That last line is resolved at runtime to be:
i->~Complete();
Complete::operator delete(dynamic_cast<void*>( i));
So I am unclear on why you may want to do this manually in a smart
pointer?
You have a confusion here. A type is incomplete when it has only been
declared, but not defined. Consider this:
//---------------------------------------------------------------
class A; // Declaration. 'A' is an incomplete type.
A* getA(); // A function implemented somewhere else
int main()
{
A* ptr = getA();
delete ptr;
// 'ptr' gets destroyed here, but 'A' is incomplete.
// The compiler doesn't have a definition of A, and thus
// can't call its destructor.
}
//---------------------------------------------------------------
That example might seem artificial, but in fact it happens more often
than you would think. It's very typical in classes, like this:
//---------------------------------------------------------------
class SomeClass
{
class A; // Declaration. Definition is in the .cc file.
SmartPtr<A> ptr; // Dynamically allocated in the constructor
public:
SomeClass();
// Initializes 'ptr' with a dynamically allocated instance of A
};
//---------------------------------------------------------------
If SomeClass doesn't have a destructor implemented in a context where
'A' is complete, the smart pointer will have to delete the object given
to it based on the definition only.