[C++-sig] Trouble destructor, call python's object with pointer in boost.python
simon zhang
hapopen at gmail.com
Sun Dec 23 00:08:08 CET 2012
You are right.Thank you.
2012/12/23 Jaedyn K. Draper <jaedyn.cppsig at jaedyn.co>
> If you pass it to a function like that, it passes it by value even if
> it's a pointer. So it's calling the copy constructor (which you haven't
> defined so it isn't printing "A start"), rather than the regular
> constructor, and then destructing it.
>
> To pass an actual pointer rather than sending it by value, you need to do
> it like this:
>
> B() { aa=new A; }
> ~B() { delete
>
> aa; }
> void run(object ct) {
> _obj=ct(); //creat a python object
>
> _obj.attr("fun1")(ptr(aa)); //call a function named "fun1" with a pointer arg
> _obj.attr("fun2")(ptr(aa)); //call a function named "fun2" with a pointer arg
> }
> A *aa;
> object _obj;
>
>
> Note that both "aa" objects are wrapped by a call to "ptr()"
>
> Just be careful with the python when doing this, as it can cause a crash
> if python tries to access that object after its C++ lifetime has ended. So
> always make sure the python object's lifetime ends before the C++ object's
> does.
>
>
> On 12/22/2012 4:45 PM, simon zhang wrote:
>
> when I call python's function with pointer as an argument in boost.python,
> there are some troubles in destructor. The following is a sample code
>
> #include <boost/python.hpp>#include <boost/python/module.hpp>#include <boost/python/def.hpp>#include <string>#include <iostream>using namespace boost::python;
> class A {public:
> A() {
> std::cout<< "A start"<<std::endl;
> }
> ~A() {std::cout<< "A end" <<std::endl**;}}class B {public:
> B() { aa=new A
>
> ; }
> ~B() { delete
>
> aa; }
> void run(object ct) {
> _obj=ct(); //creat a python object
> _obj.attr("fun1")(aa); //call a function named "fun1" with a pointer arg
> _obj.attr("fun2")(aa); //call a function named "fun2" with a pointer arg
> }
> A *aa;
> object _obj;}
>
> BOOST_PYTHON_MODULE(ctopy){
> class_<A> ("A",init<>())
> ;
> class_<b> ("B",init<>())
> .def("run",&B::run)
> ;}
>
>
> python:
>
> import ctopyclass tc:
> def fun1(self,tt):
> print "fun1"
> def fun2(self,tt):
> print "fun2"
> bb=ctopy.D()
> bb.run(tc)
>
> this result:
>
> A start
> fun1
> A end
> fun2
> A end
> A end
>
> note:
>
> The "A end" has been printed three.I try it in "valgrind",there are some
> errors.I just want to run the destructor once.How to do?
>
>
>
> _______________________________________________
> Cplusplus-sig mailing listCplusplus-sig at python.orghttp://mail.python.org/mailman/listinfo/cplusplus-sig
>
>
>
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20121223/40abc9ef/attachment-0001.html>
More information about the Cplusplus-sig
mailing list