|
Boost Users : |
From: Sergey Sikorskiy (sergey_sikorsky_at_[hidden])
Date: 2005-12-20 09:37:30
Hello everyone.
I'm trying to map into python classes shown below.
class A
{
friend class B;
public:
~A(void) {}
private:
A(B& b)
: m_B(&b)
{
}
B* m_B;
};
class B
{
friend class C;
public:
~B(void) {}
A* make_a(void)
{
return new A(*this);
}
private:
B(C& c)
: m_C(&c)
{
}
C* m_C;
};
class C
{
public:
~C(void) {}
B* make_b(void)
{
return new B(*this);
}
};
C* make_c()
{
return new C();
}
Objects are supposed to be created in the order C, B, A and destroyed
in the
order A, B, C.
I do not want to map constructors of A, B and C.
I can see three ways to do what I want:
1)
class_<A>("A", no_init);
class_<B>("B", no_init)
.def("make_a", &B::make_a, return_internal_reference<>())
;
class_<C>("C", no_init)
.def("make_b", &C::make_b, return_internal_reference<>())
;
def("make_c", make_c, return_value_policy<manage_new_object>());
2)
class_<A>("A", no_init);
class_<B>("B", no_init)
.def("make_a", &B::make_a,
return_value_policy<manage_new_object>())
;
class_<C>("C", no_init)
.def("make_b", &C::make_b,
return_value_policy<manage_new_object>())
;
def("make_c", make_c, return_value_policy<manage_new_object>());
3)
class_<A, shared_ptr<A>, noncopyable>("A", no_init);
class_<B, shared_ptr<B>, noncopyable>("B", no_init)
.def("make_a", &B::make_a,
return_value_policy<manage_new_object>())
;
class_<C, shared_ptr<C>, noncopyable>("C", no_init)
.def("make_b", &C::make_b,
return_value_policy<manage_new_object>())
;
def("make_c", make_c, return_value_policy<manage_new_object>());
C::make_b and B::make_a are supposed to return shared_ptr<B> and
shared_ptr<A> respectively in this case.
After debugging this code I've got strange results:
- In case 1 objects aren't get deleted at all;
- In case 2 objects are get deleted in wrong order;
- In case 3 objects are get deleted in wrong order;
Cases 2 and three seem to be identical to me. The only difference I can
see is
that in case 3 I should manage objects lifetime by myself from C++
code. In
opposite, in case 2 objects lifetime will be managed by python.
I couldn't get an answer to my problem neither from documentation nor
from
Boost.Python tests nor from Google.
Any explanations or suggestions will be greatly appreciated.
Thank you.
-- Sergey Sikorskiy
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net