[ITK-users] Possible missing method in itkImageSource
Joël Schaerer
joel.schaerer at laposte.net
Wed Jan 7 06:31:41 EST 2015
I just noticed that the problem is fixed in the latest release. Thanks
for the fix, and sorry for the noise!
Joel
On 07/01/2015 11:36, Joël Schaerer wrote:
> Any plans on fixing this? I've run into this issue again when
> attempting a DisconnectPipeline() on a named output. It crashes
> because the SetOutput() method attempts to create a new output after
> detaching the old one using the faulty MakeOutput(key) method:
>
> 0x000000000063a3dc in itk::ProcessObject::SetOutput (this=0x1b2e060,
> name=..., output=<optimized out>) at
> ../Modules/Core/Common/src/itkProcessObject.cxx:484
> 483 DataObjectPointer newOutput = this->MakeOutput(key);
> 484 this->SetOutput(key, newOutput); // Segfault
>
> Thanks,
>
> Joël
>
> On 22/10/2014 15:44, Bradley Lowekamp wrote:
>> Hello,
>>
>> I'm going to take a look at this issue.
>>
>> Brad
>>
>> On Oct 17, 2014, at 5:01 PM, Jim Miller <millerjv at gmail.com> wrote:
>>
>>> At first glance it looks like an oversight. I would expect, however,
>>> that we should be seeing warnings about the named version of
>>> MakeOutput in ProcessObject being hidden.
>>>
>>> Jim
>>>
>>>> On Oct 17, 2014, at 12:03 PM, Joël Schaerer
>>>> <joel.schaerer at laposte.net> wrote:
>>>>
>>>> Hi all,
>>>>
>>>> I've run into a problem with named outputs, which I believe could
>>>> be a bug in ITK.
>>>>
>>>> When using named outputs, one is supposed to create the output data
>>>> objects in the constructor using the MakeOutput method (see
>>>> http://www.itk.org/Wiki/ITK/Examples/Developer/ImageFilterMultipleOutputs
>>>> for an example). The MakeOutput method exists for both indexed and
>>>> named outputs.
>>>> .
>>>> These methods are declared and defined first in itkProcessObject:
>>>>
>>>> .h:
>>>> * ...
>>>> * ProcessObject::MakeOutput. Note that MakeOutput always returns a
>>>> * itkSmartPointer to a DataObject. ImageSource and MeshSource
>>>> override
>>>> * this method to create the correct type of image and mesh
>>>> respectively.
>>>> * If a filter has multiple outputs of different types, then that
>>>> * filter must provide an implementation of MakeOutput(). */
>>>> virtual DataObjectPointer MakeOutput( const
>>>> DataObjectIdentifierType & );
>>>> virtual DataObjectPointer MakeOutput(DataObjectPointerArraySizeType
>>>> idx);
>>>>
>>>> .cxx
>>>> DataObject::Pointer
>>>> ProcessObject
>>>> ::MakeOutput( const DataObjectIdentifierType & name )
>>>> {
>>>> itkDebugMacro("MakeOutput(" << name << ")");
>>>> if( this->IsIndexedOutputName(name) )
>>>> {
>>>> return this->MakeOutput( this->MakeIndexFromOutputName(name) );
>>>> }
>>>> return static_cast<DataObject *>(DataObject::New().GetPointer());
>>>> }
>>>>
>>>> DataObject::Pointer
>>>> ProcessObject
>>>> ::MakeOutput(DataObjectPointerArraySizeType)
>>>> {
>>>> return static_cast<DataObject *>(DataObject::New().GetPointer());
>>>> }
>>>>
>>>>
>>>> For indexed outputs, it is redefined in ImageSource in order to
>>>> create an image object of the correct type.
>>>>
>>>> template< typename TOutputImage >
>>>> ProcessObject::DataObjectPointer
>>>> ImageSource< TOutputImage >
>>>> ::MakeOutput(ProcessObject::DataObjectPointerArraySizeType)
>>>> {
>>>> return TOutputImage::New().GetPointer();
>>>> }
>>>>
>>>> So far, so good. However, the named output version of MakeOutput is
>>>> not redefined in ImageSource, contrary to what the comment in
>>>> itkProcessObject.h says. And so if someone tries to use it in an
>>>> ImageToImageFilter, it will crash.
>>>>
>>>> Any reason for this behavior? Is this an oversight?
>>>>
>>>> Thanks,
>>>>
>>>> Joël
>>>> _____________________________________
>>>>
>
More information about the Insight-users
mailing list