Boost Python - C++ class' private static data blown away before accessing in Python?

Stodge stodge at gmail.com
Wed Jul 9 14:53:28 EDT 2008


Oops - I didn't see my post so I thought something had gone wrong and
reposted. Apologies for the multiple posts.

On Jul 9, 11:57 am, Stodge <sto... at gmail.com> wrote:
> Could it be a boundary problem? The static data is initialised by the
> application. The problem arises when the python module tries to access
> it.
>
> On Jul 5, 11:14 pm, Giuseppe Ottaviano <giu... at gmail.com> wrote:
>
> > > In Python, I retrive an Entity from the EntityList:
>
> > > elist = EntityList()
> > > elist.append(Entity())
> > > elist.append(Entity())
>
> > > entity = elist.get_at(0)
>
> > > entity.foo()
>
> > > But it crashes inside foo() as the private static data is empty; or
> > > rather the string array is empty. I know before that point that the
> > > private static data is valid when accessed earlier by the C++ code as
> > > the program works fine. It just won't work from Python, so somehow the
> > > private static data has been blown away but I can't work out where or
> > > why.
>
> > Probably it is a problem of lifetime. What is the signature of append?  
> > Who deletes the appended Entity in C++ code?
> > If append takes a raw pointer, Boost.Python copies the pointer but  
> > destroys the Entity object because it is a temporary and its reference  
> > count went to zero. So the pointer in the list is referring to a  
> > destroyed object, which results in undefined behaviour.
>
> > Did you have a look at the lifetime policies of Boost.Python? The  
> > simplest way to workaround the problem is using const reference  
> > arguments, and always use value semantics. If it can result in a  
> > performance penalty, another simple way is using shared_ptr's, which  
> > have their own reference count (different from the one in CPython  
> > lib), but Boost.Python does the magic to make them work together.
>
> > HTH,
> > Giuseppe




More information about the Python-list mailing list