[Insight-developers] How to return an itk::Image correctly?

Michael Xanadu xanadu.michael at googlemail.com
Tue Oct 13 05:01:32 EDT 2009


Hi Luis,

thanks for your response. It helped me a lot. Actually my problem faces case
(2). I decided to return a SmartPointer without const. So I changed the code
to:

    template <class TImage>
    ImageType::Pointer FilterManager<TImage>::getAnything(int anyParameter)
    {
        // create filter and other stuff
        return anyItkFilter->GetOutput();
    }

In this case I get a handful error messages when compiling. It seems that I
have to change the code again:

    template <class TImage>
    typename FilterManager<TImage>::ImageType::Pointer
FilterManager<TImage>::getAnything(int anyParameter)
    {
        // create filter and other stuff
        return anyItkFilter->GetOutput();
    }

In this case the compiler works fine. Now I want to use that method so I
did:

    ImageType::Pointer myImage = filterManager->getAnything(param);

But once again the applications crashes at this point in "free.c". Do you
know what went wrong? Is the declaration ok?

Regards, Michael




2009/10/13 Luis Ibanez <luis.ibanez at kitware.com>

> Hi Michel,
>
> Thanks for the clear description of the problem that you are facing.
>
>
> There are two separate issues here:
>
>
> A) Whether the returned type should be "const" or not.
>
> B) Whether the returned type should be a raw pointer
>     or a Smart Pointer.
>
>
>
> The reason why your application crashes is most
> likely related to (B) than to (A).
>
>
>
> Let me explain (B) first:
>
> ITK Images are owned by the filter that generate them
> as output. By "owned" we mean that the filter holds a
> SmartPointer to the image and will probably be the
> one responsible for destroying the image, when the
> filter's destructor is called.
>
> When creating functions that return ITK images,
> two situations typically arise:
>
>   1) The function is a method that belongs to a class,
>        where the filters are member variables and
>        therefore they scope will keep them alive even
>        after the method in question has been executed.
>
> or
>
>    2) The function creates internally the filters that
>         will produce an ITK image as output, and the
>         scope of the filters will finish when the method
>         finishes executing.
>
> If you are in the case (1), then the function that
> creates the image can safely return the image as a
> raw pointer, since the filter that holds the smart pointer
> to the image will be kept alive by the class of which
> this filter is  a member variable.
>
> If you are in case (2), the you MUST return the image
> as a SmartPointer, to prevent the image from being
> deleted when the filter is destroyed at the point of
> getting out of the scope of the method.
>
>
> Regarding (A):
>
> Whether to use "const" pointers or non-const
> pointers.
>
> If the image that you return is still own by a filter,
> (like in case (1)),  then you MUST use "const"
> pointers, because the only class authorized to
> change the content of the image is that filter.
>
> If the image that you return, is no longer own
> by a filter (such as in case (2)), then you don't
> have to return the image as "const". In this
> case is up to you to choose "const" or "non-const".
>
>
>
>  Please let us know if you have further questions,
>
>
>     Thanks
>
>
>           Luis
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/mailman/private/insight-developers/attachments/20091013/fef3784d/attachment.htm>


More information about the Insight-developers mailing list