[Insight-users] Cannot access LightObject functions in object instantiated in DLL
Gao Han
lintworm2 at yahoo.co.uk
Wed May 12 08:58:36 EDT 2010
Dear Cory,
Thank you for your answer. I do think that function is correct, as in it
does not give the problems. I purposely added that function to show that the
problem was really in the itk::LightObject. The function was added *after* I
found the problem.
Today, I spent the whole day on tracking down the cause of this problem, and
I think I found it. When I intantiate the filter, I used a common pointer.
If I would directly run the member function Register() the program crashed,
as Register() is a member function of LightObject. So I tried to instantiate
directly into a smart pointer, and also then I got a crash when running
member functions of LightObject. However, if I manually run Register() on
the smart pointer, directly after creating, everything works fine, but I do
have to run a UnRegister() when destroying the object, otherwise it will
result in a memory leak. Why it works this way is totally beyond me, but
then again, I do not have any experience with working with DLLs. If you have
any suggestions to what is going wrong, I would greatly appreciate to hear
this.
Thank you again for responding to my message.
Sincerely,
Gao Han
For reference, I put the code in the form of a macro, which you can find it
below here:
// Macro for setting input. Arguments:
// dataT - Type of the data
// dataE - Enumeration label of the data
// dataO - The data object
// typeI - value keeping track of the current filter type
// filterT - Current filter type
// filterO - Filter Object
// nextO - Next filter in the chain
#define SET_INPUT( dataT , dataE , dataO, typeI , filterT , filterO, nextO )
\
{
\
MCAD::dataT * d = dynamic_cast<MCAD::dataT *>(dataO);
\
if (d)
\
{
\
filterT * f = dynamic_cast<filterT *>(filterO.GetPointer());
\
if (!f)
\
{
\
filterT::Pointer nf = filterT::New();
\
nf->Register();
\
f = nf.GetPointer();
\
typeI = MCAD::dataE;
\
}
\
f->SetInput(d);
\
nextO->SetInput(f->GetOutput());
\
filterO = f;
\
return true;
\
}
\
}
Cory Quammen wrote:
>
> This line
>
>> std::cout << filt->tralalie() << "\n"; // Fine....
>
> May be causing a problem.
>
> In your function
>
>> char * tralalie() {return "In itkImageToVTKImageFilter.h";}
>
> Here you are allocating a character array on the stack which is
> deallocated as soon as tralalie() returns. When you print out the
> return value from tralalie(), std::cout steps through the now-invalid
> memory. It probably works well enough to fool you into thinking it
> works, but it could be corrupting memory in a way that doesn't show up
> until you call
>
> std::cout << filt->GetReferenceCount() << "\n"; // Crash with
>
> Try removing the call to filt-tralalie() and see if that fixes your
> problem.
>
> Hope that helps,
> Cory
>
> --
> Cory Quammen
> Center for Computer Integrated Systems for Microscopy and Manipulation
> (CISMM)
> Department of Computer Science
> University of North Carolina at Chapel Hill
> http://www.cs.unc.edu/~cquammen
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.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
>
>
--
View this message in context: http://old.nabble.com/Cannot-access-LightObject-functions-in-object-instantiated-in-DLL-tp28522610p28535624.html
Sent from the ITK - Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list