Hi,Roman:<br><br>I have tried adding call policy on my constructor, but I&#39;m really no good at this.<br>I have tried all the combinations below but none of them work:<br><ul><li>init&lt;shared_ptr&lt;A&gt; const&amp; &gt;()[with_custodian_and_ward_postcall&lt;0, 2&gt; &gt;()]</li>
<li>init&lt;shared_ptr&lt;A&gt; const&amp; &gt;()[with_custodian_and_ward_postcall&lt;1, 2&gt; &gt;()]</li><li>init&lt;shared_ptr&lt;A&gt; const&amp; &gt;()[return_internal_reference&lt;1, with_custodian_and_ward&lt;1, 2&gt; &gt;()]</li>
<li>init&lt;shared_ptr&lt;A&gt; const&amp; &gt;()[return_internal_reference&lt;1, with_custodian_and_ward&lt;0, 2&gt; &gt;()]</li></ul>Could you give some more advice on this?<br>P.S.: <br>I cannot modify the code back  to use shared_ptr by value here, I have to break cyclic reference. And I think weak_ptr is no good idea, if I lock it 60 times per second for each object, I guess it would be an impact on performance.<br>
<br><div class="gmail_quote">On Wed, Mar 11, 2009 at 2:19 PM, Roman Yakovenko <span dir="ltr">&lt;<a href="mailto:roman.yakovenko@gmail.com">roman.yakovenko@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
2009/3/11 ZaeX &lt;<a href="mailto:zaexage@gmail.com">zaexage@gmail.com</a>&gt;:<br>
<div><div></div><div class="h5">&gt; Hi, All:<br>
&gt;<br>
&gt; I used a &quot;shared_ptr&lt;A&gt; const&amp;&quot; to store a ref of A in B;<br>
&gt; Well, the constructor of B seems ok, the share_ptr&lt;A&gt; seems to be well<br>
&gt; initialized;<br>
&gt; but after the constructor, I found the the pointer silently become<br>
&gt; 0xCCCCCCCC<br>
&gt;<br>
&gt; ///////////////////////////////////// below are the simplified class<br>
&gt; definitions<br>
&gt; class A{};<br>
&gt;<br>
&gt; class B<br>
&gt; {<br>
&gt; private:<br>
&gt;    shared_ptr&lt;A&gt; const&amp; m_ptr;<br>
&gt; public:<br>
&gt;    B(shared_ptr&lt;A&gt; const&amp; ptr):m_ptr(ptr) {cout&lt;&lt;m_ptr.get()&lt;&lt;endl;}<br>
&gt;    void ShowPtr(cout&lt;&lt;m_ptr.get()&lt;&lt;endl;)<br>
&gt; }<br>
&gt; /////////////////////////////////// below are my exporting code<br>
&gt;<br>
&gt;     class_&lt;B, auto_ptr&lt;B&gt; &gt;(&quot;B&quot;,  init&lt;shared_ptr&lt;A&gt; const&amp;&gt;())<br>
&gt;        .def(&quot;ShowPtr&quot;, &amp;B::ShowPtr)<br>
&gt;     ;<br>
&gt;     class_&lt;A, shared_ptr&lt;A&gt;, noncopyable &gt;(&quot;A&quot;)<br>
&gt;     ;<br>
&gt; /////////////////////////////////// below are python code<br>
&gt;  a = A()<br>
&gt;  b = B(a)  #cout output the ptr of a<br>
&gt;  b.ShowPtr()  #cout output 0xCCCCCCCC<br>
&gt;<br>
&gt; ============================================<br>
&gt; I&#39;m quite confused by the behaviors here. Could you tell me what goes wrong?<br>
<br>
</div></div>You have to bind lifetime argument to the lifetime of the created<br>
object: <a href="http://www.boost.org/doc/libs/1_38_0/libs/python/doc/tutorial/doc/html/python/functions.html#python.call_policies" target="_blank">http://www.boost.org/doc/libs/1_38_0/libs/python/doc/tutorial/doc/html/python/functions.html#python.call_policies</a><br>

<br>
Constructors also have call policies and you can use them.<br>
<br>
Anyway, you will save to yourself a lot of time, if you will use<br>
shared_ptr by value. I suggest you to change your code.<br>
<font color="#888888"><br>
--<br>
Roman Yakovenko<br>
C++ Python language binding<br>
<a href="http://www.language-binding.net/" target="_blank">http://www.language-binding.net/</a><br>
_______________________________________________<br>
Cplusplus-sig mailing list<br>
<a href="mailto:Cplusplus-sig@python.org">Cplusplus-sig@python.org</a><br>
<a href="http://mail.python.org/mailman/listinfo/cplusplus-sig" target="_blank">http://mail.python.org/mailman/listinfo/cplusplus-sig</a><br>
</font></blockquote></div><br>-- <br>Time is mana, we must hurry<br>