You should never have to call Register/UnRegister.&nbsp; The SmartPointers will take of that for you.<br><br>Here is the rule of thumb with respect to passing images into and out of routines:<br><br>&quot;Methods/functions should take raw pointers are arguments and return raw pointers as return
<br>values.&quot;<br><br>This rule of thumb avoid unnecessary manipulations of the reference count in the object<br>and avoids the overhead of the mutex that surrounds the reference count.<br><br>THERE IS AN EXCEPTION TO THIS RULE:
<br><br>&quot;If a method/function returns an image that it created AND no other reference to the<br>image is cached (for instance in an instance variable), then that image must returned<br>as a SmartPointer.&quot;<br><br>
This means the return type of a function should be a SmartPointer iff the function <br>created the image and did not store it in another persistent SmartPointer.<br><br>If the return type is not a SmartPointer in this case, the image is actually deallocated
<br>when you exit the routine.<br><br>So instead of return void*, try returning a IT_PTu16_3D::Pointer<br><br>Jim<br><br><br><br><div><span class="gmail_quote">On 4/17/06, <b class="gmail_sendername">Thomas Lambertz</b> &lt;
<a href="mailto:thomas@hexerei-software.de">thomas@hexerei-software.de</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi there,<br><br>i have some newbie questions about the correct use of smart pointer in a<br>dll. Afaik itk uses smart pointer which have a livetime of the scope<br>where the are created in. So &quot;all&quot; i have to do is using itkImage (for
<br>example) within a common scope. Hm<br><br>Can i instantiate a itkImage in an class constructor ? (i would say no -<br>after return the image would be deleted - correct ?)<br>I first tried this way but i get randomly violations when accessing the
<br>itkimage. So i searched the mailinglistarchive and found this<br><a href="http://public.kitware.com/pipermail/insight-users/2004-November/011095.html">http://public.kitware.com/pipermail/insight-users/2004-November/011095.html
</a><br>mail from Luis Ibanez. He told that there would be two options for<br>approaching the problem. Option A was to create the image in a function<br>and pass the smart pointer to the processing functions. He recommend
<br>this way. As a result the processing functions have to be called within<br>this creating function (correct ?). But what about user interaction ?<br>For example read a slice series into a itkimage and then let the user
<br>scroll through the slices. I would prefer to have to functions/methods<br>to do this ReadSeriesIntoImage() and ShowSlice(). So when<br>ReadSeriesIntoImage was done i have to leave my dll and wait for some<br>user action - and if a have understand this correct i have no common
<br>scope between these two methods.<br>Option B was a kind of faking a bit with Register()&nbsp;&nbsp;then return and<br>then UnRegister(). I tried that way and i got violations by accessing<br>that image randomly (which makes me believe, that the memorystructure
<br>was overwritten by something else). Maybe someone has enough patience to<br>read my code...<br><br>Read the fileSeries: (seems to work properly - its a modified copy and<br>paste of what Luis wrote)<br>void * dDicom::myFunction( std::string* seriesID)
<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileNamesContainer fileNames;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameGenerator-&gt;GetSeriesUIDs();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileNames = nameGenerator-&gt;GetFileNames( seriesID-&gt;c_str() );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReaderType_u16_3d::Pointer reader = ReaderType_u16_3d::New();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader-&gt;SetImageIO( dio );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader-&gt;SetFileNames( fileNames );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader-&gt;Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (itk::ExceptionObject &amp;ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetActiveWindow(), 
ex.GetDescription() ,<br>&quot;ReadSeries&quot;, MB_SETFOREGROUND);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::Pointer fakeimage = reader-&gt;GetOutput();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fakeimage-&gt;Register();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fakeimage.GetPointer
();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br>a little wrapper<br>int dDicom::getFile(std::string* seriesID) {<br>&nbsp;&nbsp;&nbsp;&nbsp;storedImage=(IT_PTu16_3D *)this-&gt;myFunction(seriesID);<br>&nbsp;&nbsp;&nbsp;&nbsp;storedImage-&gt;UnRegister();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::RegionType inputRegion;
<br>&nbsp;&nbsp;&nbsp;&nbsp;inputRegion = storedImage-&gt;GetLargestPossibleRegion();<br>&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::SizeType size = inputRegion.GetSize();<br>&nbsp;&nbsp;&nbsp;&nbsp;slices = size[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br>}<br><br><br>Showing a Slice:<br><br>void dDicom::showSlice(int slice) {
<br>&nbsp;&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::SizeType size;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::RegionType inputRegion;<br><br>//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br>// next line is where the crashes sometimes(!) happens
<br>// structure of storedImage overwritten ?<br>// best way to provoke this on my maschine is to minimize/restore the<br>window and then call showSlice - but its not deterministic<br>// to prevent other sideeffects i excluded Paint and Resize Events from
<br>my Application<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputRegion = storedImage-&gt;GetLargestPossibleRegion();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size = inputRegion.GetSize();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int max = size[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size[2]=0;&nbsp;&nbsp;&nbsp;&nbsp;// only 2 dimensions<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::IndexType start = 
inputRegion.GetIndex();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start[2]=slice;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IT_PTu16_3D::RegionType desiredRegion;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desiredRegion.SetSize( size );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desiredRegion.SetIndex ( start );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter-&gt;SetExtractionRegion( desiredRegion );
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter-&gt;SetInput( storedImage );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filter-&gt;UpdateLargestPossibleRegion();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector-&gt;SetInput( filter-&gt;GetOutput() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector-&gt;UpdateLargestPossibleRegion();
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myvtkviewer-&gt;SetInput( connector-&gt;GetOutput() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myvtkviewer-&gt;SetSize(size[0],size[1]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myvtkviewer-&gt;Render();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;catch (itk::ExceptionObject &amp;ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(GetActiveWindow(), 
ex.GetDescription() , &quot;ShowSlice&quot;,<br>MB_SETFOREGROUND);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br>Crashed could be localised in showSlice - i made some remarks before<br>that line. storedImage is a member variable of my class dDicom and
<br>should store the image after reading. Much code for a mail and i hope i<br>didnt bother you with that.<br><br>Ok - what can i do at this point ? Reading the sliceSeries everytime (<br>or even the requested slice) seems not very promising - espacially when
<br>refresh comes into play. One thought was to start a separate thread for<br>holding the image - but that sounds like breaking a butterfly on a wheel<br>to me.<br><br>Maybe someone would be kind enough to give me some hints for a solution.
<br><br>Thanks in advance,<br>with kind regards,<br>Tom<br>_______________________________________________<br>Insight-users mailing list<br><a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br><a href="http://www.itk.org/mailman/listinfo/insight-users">
http://www.itk.org/mailman/listinfo/insight-users</a><br></blockquote></div><br>