[Insight-users] passing itk::BSplineDeformableTransform between functions

Ziv Yaniv zivy at isis.imac.georgetown.edu
Wed Aug 2 10:44:23 EDT 2006


Hi Luis,

This solution is what I was using but I thought that I was missing 
something with the use of this class. In any case this is not a generic 
solution as you assume that the calling function releases the 
parameters. If the transformation is passed around (twice or more down 
the call stack) you'll have the memory leak. The "elegant"/more generic 
solution is to add a GetParameters() method that returns a pointer to 
the data so that the user can release the memory at his/her own 
discretion. While this method will break with the ITK practice of 
encapsulation the code is already "broken" as the class points to an 
external data structure.

 From a purist point of view I would add a method 
SetParameters(ParametersType &param, bool copyInput). This way the user 
can specify if the BSplineDeformableTransform should make an internal 
copy or just point to the data. Additionally, the class will have to 
keep this flag internally so that when an object is destroyed it either 
frees the memory or not. I used this approach in an implementation of a 
kD-tree, and it worked for me. This way I got the "best" of both worlds. 
If I knew I could release the data in the calling method then I set 
copyInput=false and the operation was faster. If on the other hand I 
needed to pass the kD-tree around then I copied the data and the 
object's destructor took care of releasing it.

                                           sorry for the rant
                                                           Ziv


Luis Ibanez wrote:

>
> Hi Ziv,
>
> How about creating the array before calling the function,
> and then destroying it after the function returns ?
>
>
> something like:
>
>
> void f()
> {
>
> itk::BSplineDeformableTransform<>::ParametersType *param = new
>                itk::BSplineDeformableTransform<>::ParametersType();
>
> itk::Transform<>::Pointer transformation = itk::Transform<>;
> FixedImageType::Pointer fixedImage = FixedImageType::New();
> MovingImageType::Pointer movingImage = MovingImageType::New();
>
> transformation->SetParameters( *param );
>
> register(fixedImage, movingImage, transformation);
>
> // Use transformation...
>
> // delete the parameters array.
> delete param;
>
> }
>
>
>
> It is not particularly pretty, but it should release
> the memory correctly.
>
>
> Please let us know if that works for you.
>
>
>
>    Thanks
>
>
>
>       Luis
>
>
>
> -----------------
> Ziv Yaniv wrote:
>
>> Hi all,
>>
>> I'm using the itk::BSplineDeformableTransform class and I was 
>> wondering how I pass an object of this
>> type between functions without causing a memory leak. The problem is 
>> that the transformation object only holds a
>> pointer to the parameters array and does not give access to the 
>> pointer later on so that the user can release the
>> memory.
>>
>> This is my scenario in pseudocode:
>>
>> void f() {
>>
>>  itk::Transform<>::Pointer transformation = itk::Transform<>;
>>  FixedImageType::Pointer fixedImage = FixedImageType::New();
>>  MovingImageType::Pointer movingImage = MovingImageType::New();
>>
>>  register(fixedImage, movingImage, transformation);
>>
>>           //At this location I have the transformation and I can 
>> downcast it to
>>           //BSplineDeformableTransform, but I can't get the pointer 
>> to the parameters array to release it
>> }
>>
>> void register(FixedImageType::Pointer & fixedImage,
>>              MovingImageType::Pointer & movingImage,
>>              itk::Transform<>::Pointer &transformation)
>> {
>>    itk::BSplineDeformableTransform<>::Pointer bSplineTransformation = 
>> itk::BSplineDeformableTransform<>::New();
>>
>>    transformation = bSplineTransformation; //point to what will be 
>> the result
>>
>>               //allocate the parameters array on the heap so that it 
>> still exists after we exit the method
>>    itk::BSplineDeformableTransform<>::ParametersType *param = new 
>> itk::BSplineDeformableTransform<>::ParametersType();
>>
>>    bSplineTransformation->SetParameters(*param);
>>
>> }
>>
>> Perhaps I'm missing something.
>>
>>                               thanks
>>                                    Ziv
>>
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>>
>>
>
>
>
>


-- 
=======================================================
Ziv Yaniv, PhD., Postdoctoral Fellow
Imaging Science and Information Systems (ISIS) Center
Department of Radiology
Georgetown University Medical Center
2115 Wisconsin Avenue, Suite 603
Washington, DC, 20007,

Phone: +1-202-687-2902
Fax: +1-202-784-3479
email: zivy at isis.imac.georgetown.edu
web: http://isiswiki.georgetown.edu/zivy/



More information about the Insight-users mailing list