Re: About cloning
{ Double spacing removed. -mod }
Mathias Gaunard wrote:
How do we deallocate the memory though?
you could try the clone/release scenario with customized allocator.
quick draft attached.
#include <memory>
#include <cstdio>
struct Base
{
virtual ~Base() = 0;
virtual Base* clone() const = 0;
virtual void release() = 0;
};
inline Base::~Base()
{
}
template < template < typename > class A >
struct Derived
:
public Base
{
typedef A< Derived > Allocator;
explicit Derived( Allocator const& a = Allocator() )
:
allocator_( a )
{
std::printf( "Derived( self = %p )\n", this );
}
explicit Derived( Derived const& rhs )
:
allocator_( rhs.allocator_ )
{
std::printf( "Derived( self = %p, rhs = %p )\n", this,
&rhs );
}
~Derived()
{
std::printf( "~Derived( self = %p )\n", this );
}
Base* clone() const
{
Derived* p = allocator_.allocate( 1 );
allocator_.construct( p, *this );
return p;
}
void release()
{
allocator_.destroy( this );
allocator_.deallocate( this, 1 );
}
mutable Allocator allocator_;
};
int main()
{
Derived< std::allocator > const d;
Base* b = d.clone();
b->release();
return 0;
}
$ g++ cloning.cpp -O2 -Wall -Weffc++ -o cloning && ./cloning
Derived( self = 0x7fff3e5357c0 )
Derived( self = 0x602010, rhs = 0x7fff3e5357c0 )
~Derived( self = 0x602010 )
~Derived( self = 0x7fff3e5357c0 )
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]