Not quite sure what is going on here. I am<br>serializing shared_ptr, that make use of <br>derivation from enable_shared_from_this.<br><br>However when my class is restored from<br>disk, it appears that accessing shared_from_this()<br>
throws a tr1::bad_weak_ptr.<br>Using boost 1.42, gcc 4.2.1, on suse linux.<br><br>Has any one hit a similar issues, or found any<br>work arounds ? Any help greatly appreciated.<br><br>Here is some contrived standalone code, that demonstrate<br>
the problem.<br><br>/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8<br>// =========== file Main.cpp ===================<br>// After restoring a class via shared_ptr it<br>// appears as if enable_shared_from_this has not<br>
// been honoured. When accessing shared_from_this()<br>// I get tr1::bad_weak_ptr exception.<br><br>#include &lt;iostream&gt;<br>#include &lt;fstream&gt;<br>#include &lt;assert.h&gt;<br><br>#include &lt;boost/archive/text_iarchive.hpp&gt;<br>
#include &lt;boost/archive/text_oarchive.hpp&gt;<br>#include &lt;boost/serialization/base_object.hpp&gt;<br>#include &lt;boost/serialization/string.hpp&gt;<br>#include &lt;boost/serialization/vector.hpp&gt;<br>#include &lt;boost/serialization/shared_ptr.hpp&gt;<br>
#include &lt;boost/serialization/export.hpp&gt;<br><br>#include &lt;boost/shared_ptr.hpp&gt;<br>#include &lt;boost/enable_shared_from_this.hpp&gt;<br><br>using namespace std;<br>using namespace boost;<br><br>class Base :<br>
��� public boost::enable_shared_from_this&lt;Base&gt; ,<br>��� private boost::noncopyable {<br>protected:<br>���� Base() {}<br>��� virtual ~Base() {}<br>public:<br>� ��� virtual const std::string&amp; name() const� = 0;<br>
private:<br>��� friend class boost::serialization::access;<br>��� template&lt;class Archive&gt;<br>��� void serialize(Archive &amp; ar, const unsigned int){}<br>};<br>typedef boost::shared_ptr&lt;Base&gt; base_ptr;<br><br>
<br>class Derived : public Base {<br>public:<br>��� Derived(const std::string&amp; name ) <br>�������������� : Base(), name_(name){}<br>��� Derived() {}<br>��� virtual ~Derived() {}<br><br>��� virtual const std::string&amp; name() const { return name_;}<br>
<br>��� base_ptr find(const std::string&amp; name) const {<br>��� ��� if (name_ == name) {<br>��� ��� ��� Derived* nonConstThis = const_cast&lt;Derived*&gt;(this);<br>��� ��� ��� return nonConstThis-&gt;shared_from_this(); // throws after restore ?<br>
��� ��� }<br>��� ��� return base_ptr();<br>��� }<br><br>private:<br>��� std::string name_;<br>��� friend class boost::serialization::access;<br>��� template&lt;class Archive&gt;<br>��� void serialize(Archive &amp; ar, const unsigned int) {<br>
������� ar &amp; boost::serialization::base_object&lt;Base&gt;(*this);<br>������� ar &amp; name_;<br>��� }<br>};<br>typedef boost::shared_ptr&lt;Derived&gt; d_ptr;<br><br>class Holder {<br>public:<br>��� Holder() {}<br>��� void add(d_ptr b) { vec_.push_back(b);}<br>
<br>��� base_ptr find(const std::string&amp; name) const {<br>��� ��� for(size_t i=0; i &lt; vec_.size(); i++){<br>��� ��� ��� base_ptr base = vec_[i]-&gt;find(name);<br>��� ��� ��� if (base) return base;<br>��� ��� }<br>
��� ��� return base_ptr();<br>��� }<br>private:<br>��� std::vector&lt;d_ptr&gt; vec_;<br><br>��� friend class boost::serialization::access;<br>��� template&lt;class Archive&gt;<br>��� void serialize(Archive &amp; ar, const unsigned int){<br>
�������� ar &amp; vec_;<br>��� }<br>};<br><br>void save(const Holder&amp; holder, const char* filename)<br>{<br>��� std::ofstream ofs( filename );<br>��� boost::archive::text_oarchive oa( ofs );<br>��� oa &lt;&lt; holder;<br>
}<br><br>void restore(Holder&amp; holder, const char* filename)<br>{<br>��� std::ifstream ifs( filename );<br>��� boost::archive::text_iarchive ia( ifs );<br>��� ia &gt;&gt; holder;<br>}<br><br>int main()<br>{<br>��� std::string fileName = &quot;test.txt&quot;;<br>
<br>��� {<br>��� ��� Holder holder;<br>��� ��� holder.add( d_ptr(new Derived(&quot;me&quot;)));<br>��� ��� holder.add( d_ptr(new Derived(&quot;you&quot;)));<br><br>��� ��� base_ptr b = holder.find(&quot;me&quot;);<br>��� ��� assert(b.get()); // works<br>
<br>��� ��� save(holder, fileName.c_str());<br>��� }<br><br><br>��� Holder restored;<br>��� restore(restored,fileName.c_str());<br><br>��� // why does the restored class throw<br>��� // a weak ptr exception<br>��� try {<br>
��� ��� base_ptr b = restored.find(&quot;me&quot;); // fails ?<br>��� ��� assert(b.get()); // never gets here<br>��� }<br>��� catch (std::exception&amp; e) {<br>��� ��� std::cout &lt;&lt; &quot;Ooops exception &quot; &lt;&lt; e.what()<br>
��� ��� &lt;&lt; &quot; thrown, test failed??? \n&quot;;<br>��� ��� std::remove(fileName.c_str());<br>��� ��� return 1;<br>��� }<br><br>��� std::remove(fileName.c_str());<br>��� cout &lt;&lt; &quot;test passed\n&quot;;<br>
}<br clear="all"><br><br><br> � Best regards,<br>Ta,<br> � �Avi<br><br>