Differences between revisions 1 and 10 (spanning 9 versions)
Revision 1 as of 2007-11-24 19:58:16
Size: 1962
Editor: 40
Comment:
Revision 10 as of 2009-08-21 18:48:32
Size: 1977
Editor: dsl093-003-175
Comment: fixed grammar mistakes and made more readable
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
Since Python handles memory allocation and garbage collection automatically, the concept "pointer" is not meaningful within Python. However, many C++ API exposes either raw pointers or shared pointers, and to wrap such APIs one would need to deal with pointers. Since Python handles memory allocation and garbage collection automatically, the concept of a "pointer" is not meaningful in Python. However, many C++ APIs expose either raw pointers or shared pointers, to wrap these APIs we need to deal with pointers.
Line 5: Line 5:
=== Pointers (raw C++ pointers) === === Raw C++ Pointers ===
Line 7: Line 7:
The life time of C++ objects created by "new A" kan be handled by Pythons garbage collection by using the {{{manage_new_object}}} storage policy: The lifetime of C++ objects created by {{{new A}}} can be handled by Python's garbage collection by using the {{{manage_new_object}}} return policy:
Line 9: Line 9:
{{{struct A { {{{
struct A {
Line 17: Line 18:
        .def("create",&A::create,return_value_policy<manage_new_object>())         .def("create",&A::create, return_value_policy<manage_new_object>())
Line 28: Line 29:
print A.hello() print an_A.hello()
Line 33: Line 34:
Smart pointers, e.g. boost::shared_ptr<T>, is another common way to
give away ownership of objects in C++. The following suggests a way to
handle shared_ptr objects in Python, introducing the notation
{{{(+ptr).foo()}}} in python to immitate C++'s {{{(*ptr).foo()}}}:
The usage of smart pointers (e.g. {{{boost::shared_ptr<T>}}}) is another common way to give away ownership of objects in C++. These kinds of smart pointer are automatically handled if you declare their existence when declaring the class to boost::python. This is done by including the holding type as a template parameter to {{{class_<>}}}, like in the following example:
Line 38: Line 36:
{{{#include <boost/shared_ptr.h> {{{
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>
Line 40: Line 42:
using namespace std;
using namespace boost::python;
Line 42: Line 46:
  shared_ptr<A> create () { return shared_ptr<A>(new A); }
  std::string hello () { return "Just nod if you can hear me!"; }
    static shared_ptr<A> create () { return shared_ptr<A>(new A); }
   std::string hello () { return "Just nod if you can hear me!"; }
Line 48: Line 52:
    class_<A>("A",init<>())
        .def("create",&A::create,return_value_policy<return_by_value>())
    class_<A, shared_ptr<A> >("A",init<>())
        .def("create",&A::create )
Line 52: Line 56:
        ;

    class_< shared_ptr<A> >("A_ptr", init<const shared_ptr<A>& >())
        .def("__pos__",&boost::shared_ptr<A>::get,return_internal_reference<>())
        ;
    ;
Line 61: Line 61:
Line 63: Line 64:
an_A = A_ptr.create()
print (+an_A).hello()
an_A = A.create()
print an_A.hello()

Pointers and smart pointers

Since Python handles memory allocation and garbage collection automatically, the concept of a "pointer" is not meaningful in Python. However, many C++ APIs expose either raw pointers or shared pointers, to wrap these APIs we need to deal with pointers.

Raw C++ Pointers

The lifetime of C++ objects created by new A can be handled by Python's garbage collection by using the manage_new_object return policy:

struct A {
    static A*   create () { return new A; }
    std::string hello  () { return "Hello, is there anybody in there?"; }
};

BOOST_PYTHON_MODULE(shared_ptr)
{
    class_<A>("A",no_init)
        .def("create",&A::create, return_value_policy<manage_new_object>())
        .staticmethod("create")
        .def("hello",&A::hello)
        ;
}

A sample python program:

from pointer import *
an_A = A.create()
print an_A.hello()

Smart pointers

The usage of smart pointers (e.g. boost::shared_ptr<T>) is another common way to give away ownership of objects in C++. These kinds of smart pointer are automatically handled if you declare their existence when declaring the class to boost::python. This is done by including the holding type as a template parameter to class_<>, like in the following example:

#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

using namespace boost;
using namespace std;
using namespace boost::python;

struct A {
    static shared_ptr<A> create () { return shared_ptr<A>(new A); }
    std::string   hello  () { return "Just nod if you can hear me!"; }
};

BOOST_PYTHON_MODULE(shared_ptr)
{
    class_<A, shared_ptr<A> >("A",init<>())
        .def("create",&A::create )
        .staticmethod("create")
        .def("hello",&A::hello)
    ;
}

A sample python program:

from shared_ptr import *
an_A = A.create()
print an_A.hello()

boost.python/PointersAndSmartPointers (last edited 2009-12-01 12:27:34 by tomato)

Unable to edit the page? See the FrontPage for instructions.