[C++-sig] shared_ptr -> weak_ptr -> shared_ptr

Andreas Beyer beyer at imb-jena.de
Wed Apr 13 23:14:44 CEST 2005


Hi.

I would like to transform a shared pointer originating from a python 
object to a weak pointer. Later I would like to transform it back to a 
shared pointer. For some strange reason I keep getting seg-faults when 
trying to lock the weak pointer.
Is there any danger in storing shared pointers from python objects as 
weak pointers?
According to the weak pointer's docu, lock() returns an empty shared_ptr 
if the refered object expired. However, in my example this shouldn't be 
the case anyway.

The test case:

using namespace boost;

struct A { };

typedef shared_ptr<A> A_ptr_shared;
typedef weak_ptr<A> A_ptr_weak;

void transform(A_ptr_shared a) {
   std::cerr << a.get() << std::endl;
   A_ptr_weak aw(a);
   std::cerr << "have weak" << std::endl;
   A_ptr_shared as = aw.lock(); // boom!
   std::cerr << "lock is ok" << std::endl;
   std::cerr << as.get() << std::endl;
}

BOOST_PYTHON_MODULE(ptr_test) {
  python::class_<A> ("A");
  python::register_ptr_to_python< A_ptr_shared >();

  python::def("transform", &transform);
}


The python session:

 >>> from ptr_test import *
 >>> a=A()
 >>> transform(a)
0x8190a58
have weak
Segmentation fault (core dumped)





More information about the Cplusplus-sig mailing list