[C++-sig] eposing classes with protected destructors

Daniel Paull dlp at fractaltechnologies.com
Mon Dec 23 04:41:05 CET 2002


BTW, I also added a template function to get my source to compile:

namespace boost { 
template<class T> T * get_pointer( RefCountedObject<T> const& p )
{
    return p.get();
}
}

This should help anyone trying to reproduce the problem.

Cheers,

Daniel Paull


> -----Original Message-----
> From: c++-sig-admin at python.org [mailto:c++-sig-admin at python.org] On
Behalf
> Of Daniel Paull
> Sent: Monday, 23 December 2002 11:06 AM
> To: c++-sig at python.org
> Subject: [C++-sig] eposing classes with protected destructors
> 
> Hi all,
> 
> I've just updated to the latest CVS version of boost.python and am
> having trouble exposing classes with protected destructors.  The
classes
> in the library that I am wrapping have protected destructors to
enforce
> the use of the a ref-counting mechanism for object lifetime
management.
> 
> Previously I had done the following to get Python/C++ to work
together:
> 
> ------------------------
> template< class T >
> class RefCountedObject
> {
> public:
> 	typedef T element_type;
> 	explicit RefCountedObject( T* t ) : m_pPtr( t )
> 	{
> 		if ( m_pPtr ) m_pPtr->addRef();
> 	}
> 
> 	~RefCountedObject()
> 	{
> 		if ( m_pPtr ) m_pPtr->releaseRef();
> 	}
> 
> 	T& operator*() const { return *get(); }
> 	T* operator->() const{ return get(); }
> 	T* get() const { return m_pPtr; }
> private:
> 	T* m_pPtr;
> };
> 
> class_< WrappedClass, RefCountedObject< WrappedClass >, ... >( ... )
> 	...
> 	;
> ------------------------
> 
> Here the RefCountedObject simply increments the refcount of the C++
> object to hold it alive while Python is using it.  This reference is
> released when the Python Object (and hence, the RefCountedObject) is
> destroyed.
> 
> I thought this was pretty neat, though I'd be happy to get advice on a
> better solution if one exists.
> 
> The compile error I get with the latest CVS version is that the
> destructor of "WrappedClass" is inaccessible at line 22 of
> boost/python/detail/destroy.hpp.
> 
> I've tracked this back to rvalue_from_python_data.hpp (line 132):
> 
> ---------------
> template <class T>
> inline rvalue_from_python_data<T>::~rvalue_from_python_data()
> {
>     if (this->stage1.convertible == this->storage.bytes)
>
python::detail::destroy_referent<ref_type>(this->storage.bytes);
> }
> ---------------
> 
> I won't pretend to know all the details of what is going on here, but
I
> have an inkling that the "if" test would fail in this case, but
> obviously, the code for the referent destroyer must be compiled
anyhow.
> 
> Any suggestions?
> 
> 
> Cheers,
> 
> Daniel Paull
> 
> 
> 
> 
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig





More information about the Cplusplus-sig mailing list