[Insight-users] ResampleImageFilter crashes in release mode
Luis Ibanez
luis.ibanez at kitware.com
Wed Jul 8 10:28:02 EDT 2009
Hi Michael,
About your questions (2),(3) and (5):
(2) The GetPointer() method from a smart pointer returns
the raw pointer that is associated to it.
SmartPointers can't perform casting between derived
classes. That is
If Class B derives from Class A.
The SmartPointer<B> cannot be casted to a SmartPointer<A>.
However the raw pointer to B can be assigned to a
SmartPointer< A >.
In general we avoid having to call GetPointer() by
making the input arguments of ITK functions to be raw
pointers.
(3) As pointed out above, there are good reasons for
using raw pointers as arguments to functions.
The rule of thumb is:
A) If you are confident that the object being passed
as input, is hold by another object, and will be
kept alive for the duration of this function call,
then you can be confident on passing raw pointers.
or
B) If you can't guarantee that the object will be
kept alive, then you rather should use a smart
pointer as the function argument type.
When in doubt: Look at similar ITK classes :-)
(5) SetOutpuDirection() copies the direction cosines of
one image into the output image of the resample filter.
It is common for medical images to have a variety of
orientations. Typical examples are: Axial, Sagital
and Coronal.
For more details, please look at:
http://www.itk.org/Wiki/Proposals:Orientation
in particular to:
http://www.itk.org/Wiki/Proposals:Orientation#DICOM_LPS_Orientation_-_Full_Body_Graphical_Example
Regards,
Luis
--------------------------
Michael Schildt wrote:
> Hello,
>
> if there are conflicting static global symbols for ITK and wxWidgets,
> the conflict(s) must be located in the changes of the wxSlider
> implementation from Version 2.8.8 to Version 2.8.9. Because, without
> wxSlider the problem does not occur.
>
> Is their a small chance that someone can answer the questions 2) 3) and
> maybe 5) of my former post? I'm pretty unsure and confused how to handle
> this in my future software developments. Or at least a hint were to look
> for the answers.
>
> Best reguards,
> Michael Schildt
>
> Bill Lorensen schrieb:
>
>> Maybe there is a clash of the symbols between the two libraries. We
>> should try to track this down. ITK should have very few external
>> static variables. In general that's back coding practice to have these
>> global symbols.
>>
>> On Tue, Jul 7, 2009 at 5:08 PM, Luis Ibanez<luis.ibanez at kitware.com>
>> wrote:
>>
>>
>>> Hi Michael,
>>>
>>>
>>> Thanks for testing the code in your platform.
>>>
>>>
>>> The fact that the order of libraries matters may indicate
>>> that the problem results from the order of initialization
>>> of a static variable.
>>>
>>> Something that may originate from any singleton class,
>>> or from any of our static variables in ITK or in
>>> wxWindows...
>>>
>>>>>> Thanks for posting to the list the solution that
>>> you found.
>>>
>>> We probably should put this somewhere
>>> in the ITK Wiki...
>>>
>>> Maybe in the FAQ...
>>>
>>>
>>>
>>> Thanks
>>>
>>>
>>> Luis
>>>
>>>
>>>
>>> ------------------------
>>> Michael Schildt wrote:
>>>
>>>
>>>> Hello Luis,
>>>>
>>>> first of all, thank you a lot for the efforts you are putting into
>>>> answering my questions and for your hints. It helps me a lot but
>>>> raises some
>>>> new questions.
>>>> Your modified example runs and runs not under windows. It depends on
>>>> the
>>>> order of library linking. If ITK comes first the program runs fine. If
>>>> wxWidgets comes first it does not. The same is true for my first
>>>> example.
>>>> So, without any changes in source both are running fine with the right
>>>> linking order.
>>>>
>>>> 1) I changed the order of lines for linking in your CMakeLists.txt to:
>>>> TARGET_LINK_LIBRARIES(itkWxWindows
>>>> ${wxWidgets_LIBRARIES}
>>>> ITKCommon
>>>> )
>>>>
>>>> Then the example crashs again at resampler->Update().
>>>>
>>>> With this new insights, i checked against my application by changing
>>>> the
>>>> order of the linking. And, it runs perfect now. It seems order is
>>>> important
>>>> but normally it must not.
>>>>
>>>> Luis Ibanez schrieb:
>>>>
>>>>
>>>>
>>>>> Hi Michael,
>>>>>
>>>>> Thanks for reducing the problem to a minimal
>>>>> example and posting it to the list.
>>>>>
>>>>> I have build your code under Linux (Ubuntu)
>>>>> and ran Valgrind on it.
>>>>>
>>>>> Found that you were not initializing the pixel
>>>>> data of the memory buffers passed to the
>>>>> Import filter, and fixed that.
>>>>>
>>>>> Also fixed an assignment between smart
>>>>> pointers that was not compiling under gcc
>>>>>
>>>>> TransformType::ConstPointer cversor = iversor;
>>>>>
>>>>> was replaced with:
>>>>>
>>>>> TransformType::ConstPointer cversor = iversor.GetPointer();
>>>>>
>>>>
>>>> 2) What is the difference between first and second statement? Or
>>>> better,
>>>> what is GetPointer() doing and when to use the method call and when
>>>> to use
>>>> the object directly? (documentation says about GetPointer: "Access
>>>> function
>>>> to pointer.")
>>>>
>>>>
>>>>
>>>>> although a better solution is to change the API of
>>>>> your "transformImage" method to take const raw
>>>>> pointers instead of SmartPointer. (the code was
>>>>> modified accordingly).
>>>>>
>>>>
>>>> 3) That is somehow ambiguous. Within my custom library i do it
>>>> always that
>>>> way. Just within ITK i use the smartpointers, because it is
>>>> recommended. As
>>>> far as i understood, Smartpointer are better than normal pointer,
>>>> because
>>>> they know how many references are held to the object and it can be
>>>> destroyed
>>>> automatically when the number of references become zero.
>>>> So, please can you specfify a rule when to use smartpointer and when to
>>>> use normal pointers for ITK?
>>>>
>>>>
>>>>
>>>>> The code runs under Linux, both under Release and
>>>>> Debug without crashing.
>>>>>
>>>>
>>>> 4) I will check under Linux later. I did not test this issue under
>>>> Linux
>>>> until now.
>>>>
>>>>
>>>>
>>>>> Please find the modified code attached.
>>>>>
>>>>> (Note that, I put the boolean flag of the import filter
>>>>> to "true", temporarily, in order to avoid a memory
>>>>> leak report in Valgrind. You probably want to
>>>>> put it back to "false" in your code).
>>>>>
>>>>> Also, note that you will need to copy in the same
>>>>> directory as the main.cxx, the file:
>>>>>
>>>>> Insight/Testing/Code/BasicFilters/itkFilterWatcher.h
>>>>>
>>>>> This is just to capture progress events.
>>>>>
>>>>>
>>>>> Please try the attached code and let us know
>>>>> if that makes any difference when you run it
>>>>> in your Windows system.
>>>>>
>>>>>
>>>>>
>>>>
>>>> 5) What is SetOutputDirection() good for - documentation says: "Set the
>>>> output direciton cosine matrix."
>>>> But actually, i do not understand what this means. Could you help me
>>>> out
>>>> once more?
>>>>
>>>>
>>>> With best reguards,
>>>> Michael Schildt
>>>>
>>>>
>>>>
>>>>> Regards,
>>>>>
>>>>>
>>>>> Luis
>>>>>
>>>>>
>>>>> ---------------------------------------------------------
>>>>> On Mon, Jul 6, 2009 at 5:39 AM, Michael Schildt
>>>>> <michael.schildt at ifn-magdeburg.de
>>>>> <mailto:michael.schildt at ifn-magdeburg.de>>
>>>>> wrote:
>>>>>
>>>>> Hello Luis,
>>>>>
>>>>> I checked your points 1) and 3) to 5) but had no luck.
>>>>>
>>>>> But with 2) i have tracked down the problem to be an interplay of
>>>>> ITK and wxWidgets and found a workaround too.
>>>>> Basically, when i use an wxSplitterWindow ITK crashes, when
>>>>> commenting the wxSlitterWindow stuff out ITK works as expected. I
>>>>> used ITK 3.14, wxPack 2.8.9 and Visual Studio 2008 Express Edition.
>>>>> I have created a minimal example application (main.cpp,
>>>>> CMakeLists.txt) attched at the end of the message that makes this
>>>>> problem reproducable without additional dependencies. Running in
>>>>> Release or RelWithDebInfo will crash under Windows XP at
>>>>> resampler->Update(). Commenting out line 36 (m_splitter2 = new
>>>>> wxSplitterWindow( this, wxID_ANY, wxDefaultPosition,
>>>>> wxDefaultSize, 0 );) will make ITK running smooth without a crash.
>>>>>
>>>>> And, a workaround was found while trying program on an other PC.
>>>>> By using wxPack 2.8.8 instead of wxPack 2.8.9 the problem is gone.
>>>>> So, a downgrade to prior minor Version of wxWidgets is sufficient.
>>>>>
>>>>> But, i have not really an exmplaination for that. Especially the
>>>>> fact that the splitter in not instanciated before ITK runs. Would
>>>>> be nice to find how wxWidgets influences ITK!
>>>>>
>>>>> Best reguards,
>>>>> Michael Schildt
>>>>>
>>>>>
>>>>>
>>>>>
>>>
>>> _____________________________________
>>> Powered by www.kitware.com
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Please keep messages on-topic and check the ITK FAQ at:
>>> http://www.itk.org/Wiki/ITK_FAQ
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.itk.org/mailman/listinfo/insight-users
>>>
>>>
>>
>>
>>
>>
>
>
More information about the Insight-users
mailing list