<br><br><div class="gmail_quote">On Fri, Nov 6, 2009 at 6:26 AM, Anja Ende <span dir="ltr">&lt;<a href="mailto:anja.ende@googlemail.com">anja.ende@googlemail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hello,<br>
<br>
A quick question about returning a smart pointer from class functions.<br>
Is this the correct ussage?<br>
<br>
class SomeClass<br>
{<br>
   vtkPolayData * SomeMethod()<br>
   {<br>
      vtkSmartPointer&lt;vtkPolyData&gt; myData = vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>
      ....<br>
      return myData;<br>
   }<br>
}<br>
<br>
In the caller:<br>
<br>
vtkPolyData * data = instance.SomeMethod();<br>
<br>
Would this work? Or am I better off with using class members and<br>
deleting them in the destructor when I want to pass data around?<br>
<br></blockquote><div><br></div><div>As written this would not work, the single reference would disappear after &quot;return myData&quot;, since myData would go out of scope. You have a few options here:</div><div><br></div>
<div>1. Store it in a class member and call Delete() in the destructor as you suggest. This is the cleanest solution. If the caller desires to keep the poly data around after the lifetime of the SomeClass instance, it can just call data-&gt;Register(0) to own an additional reference.</div>
<div><br></div><div>2. Return the new instance without using smart pointers. This will leave a dangling reference, and the documentation should clearly state that whoever calls the method is responsible for calling Delete() on the resulting object. This is what is normally done for factory-type methods.</div>
<div><br></div><div>Jeff</div></div>