[C++-sig] Lifetime of Python object for a pointer argument

Min Xu minxu at sci.ccny.cuny.edu
Sat Feb 16 18:51:25 CET 2002


Thank you for the nice and quick reply. I downloaded the v2. However in
<boost_root>/libs/python
# jam -sBOOST_ROOT=/usr/local/src/boost -sTOOLS="gcc" -sBUILD=debug 
unknown target type for <libs!python>libbpl.a

The machine is a linux box with gcc and python2.1. How can I compile it?

On Sat, 2002-02-16 at 11:41, David Abrahams wrote:
> Your analysis of what's going wrong here is correct. There is a way to make
> what you're doing "work" with Boost.Python V1, but it's ugly. You have to
> wrap geometry with a "callback" class as though it had virtual
> functions(www.boost.org/libs/python/doc/overriding.html):
> 
> // Warning: off-the-cuff, untested
> 
> struct geometry_callback : geometry
> {
>     geometry(PyObject* self, PyObject* grid_obj)
>         : grid_obj(grid_obj)
>     { Py_XINCREF(grid_obj); }
> 
>     ~geometry() { Py_XDECREF(grid_obj); }
> 
>     PyObject* grid_obj;
> };
> 
> python::class_builder<geometry, geometry_callback>
> geometry_class(this_module, "geometry");
> ...
> 
> but note, that your to_python(const grid*) function also results in the grid
> being /copied/ (probably not what you want). Boost.Python V2 (currently in
> prerelease) provides a better approach:
> 
> BOOST_PYTHON_MODULE_INIT(ngf2)
> {
>    python::module("ngf2)
>       .add(
>            class<grid>("grid")
>                .def_init()
>           )
>       .add(
>            class<geometry>("geometry")
> 
>               .def_init(args<const grid*>()
>               // Keep the grid alive as long as the geometry is.
>                         , python::with_custodian_and_ward<1,2>())
> 
>               .def("getGrid", &geometry::getGrid
>               // keep the geometry object alive as long as the result is
>                    , python::return_internal_reference<>())
>           );
> }
> 
> ----- Original Message -----
> From: "Min Xu" <minxu at sci.ccny.cuny.edu>
> > Hi,
> >
> > I am a newbie of boost python. In the process of converting a SWIG
> > wrapping of a C++ library to boost python, I encounter the following
> > problem:
> >
> > // C++ part
> > class grid
> > {
> > public:
> >    grid() { ... }
> >    ...
> > };
> >
> > class geometry
> >
> 
> > public:
> >     geometry(const grid * gd) : gd(gd) {}
> >     const grid* getGrid() const { return gd; }
> > private:
> >     const grid* gd;
> > };
> >
> > // Wrapper
> > #include <boost/python/class_builder.hpp>
> > namespace python = boost::python;
> >
> > PyObject* to_python(const grid* g) {
> >      return to_python(*g); // convert const grid* in terms of const
> > grid&
> > }
> >
> > BOOST_PYTHON_MODULE_INIT(ngf2)
> > {
> >   try
> >   {
> >     python::module_builder this_module("ngf2");
> >     python::class_builder<grid> grid_class(this_module, "grid");
> >     grid_class.def(python::constructor<>());
> >     python::class_builder<geometry> geometry_class(this_module,
> > "geometry");
> >     geometry_class.def(python::constructor<const grid*>());
> >   }
> >   ...
> > }
> >
> > The compilation works well (the newest CVS version of boost python).
> > In python:
> > >>> from ngf2 import *
> > >>> a=geometry (grid())
> > >>> a.getGrid ().a()
> > 8.6723632812500586   # corrupted as grid() is deleted automatically?
> > >>> g=grid()
> > >>> b=geometry (g)
> > >>> b.getGrid ().a()
> > 1.0                  # expected.
> > >>> del g
> > >>> b.getGrid ().a()
> > 1.3285421879284814e-269 # corrupted
> >
> > I understand it may be a ref counting problem. Is there any way to make
> > the first idiom work?
> >
> > Thanks!
> >
> >
> > Min Xu
> >
> >
> >
> >
> >
> > _______________________________________________
> > C++-sig mailing list
> > C++-sig at python.org
> > http://mail.python.org/mailman/listinfo/c++-sig
> >
> 
> 
> _______________________________________________
> 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