Re: Implementing a smart pointer which works with incomplete types
Pete Becker wrote:
There's no difference.
Well, my tests with gcc disagree with this. That type of smart pointer
class correctly calls the destructor of the object, while a more
"traditional" doesn't.
Getting the situation to happen is a bit complicated, but I have tried
to simplify it as much as possible:
//==================== GenericPtr.hh ====================
template<typename T>
class GenericPtr1 // "Traditional" smart pointer
{
T* ptr;
public:
GenericPtr1(T* p): ptr(p) {}
~GenericPtr1() { delete ptr; }
};
template<typename T>
class GenericPtr2 // A version which should work with incomplete types
{
T* ptr;
typedef void(*DeleteFunctionType)(T* p);
DeleteFunctionType deleteFunction;
static void doDelete(T* p) { delete p; }
public:
GenericPtr2(T* p): ptr(p), deleteFunction(doDelete) {}
~GenericPtr2() { deleteFunction(ptr); }
};
//==================== AClass.hh ====================
#include "GenericPtr.hh"
class ClassToBeManaged;
class AClass
{
GenericPtr1<ClassToBeManaged> ptr1;
GenericPtr2<ClassToBeManaged> ptr2;
public:
AClass();
};
//==================== AClass.cc ====================
#include "AClass.hh"
#include "ClassToBeManaged.hh"
AClass::AClass():
ptr1(new ClassToBeManaged(1)), ptr2(new ClassToBeManaged(2))
{}
//==================== ClassToBeManaged.hh ====================
class ClassToBeManaged
{
int id;
public:
ClassToBeManaged(int i);
~ClassToBeManaged();
};
//==================== ClassToBeManaged.cc ====================
#include "ClassToBeManaged.hh"
#include <iostream>
ClassToBeManaged::ClassToBeManaged(int i): id(i)
{ std::cout << "Constructed " << id << std::endl; }
ClassToBeManaged::~ClassToBeManaged()
{ std::cout << "Destructed " << id << std::endl; }
//==================== test.cc ====================
#include "AClass.hh"
int main()
{
AClass a;
}
Running this program produces:
Constructed 1
Constructed 2
Destructed 2
This means that GenericPtr1 did not call the destructor of
ClassToBeManaged properly, while GenericPtr2 did.