[vtkusers] Help with crashes in VTK

Jonathan Morra jonmorra at gmail.com
Thu Sep 8 23:03:58 EDT 2011


So I've spent a bunch of time and removed all the references to
vtkSmartPointer.  I'm still getting a lot of crashes.  Here is an example of
a crash that I just got without any use of vtkSmartPointers

My code

vtkPolyData* vtkPipelines::getOrganMesh(vtkImageData * const binaryImage) {
    vtkPolyData *returnedData = NULL;

    vtkMarchingCubes *marching = vtkMarchingCubes::New();
    marching->SetInput(binaryImage);
    marching->ComputeGradientsOff();
    marching->ComputeNormalsOff();
    marching->ComputeScalarsOff();
    marching->SetValue(0, 0.5);
    if (marching->GetOutput()->GetNumberOfPoints() > 0) {
        // The decimation makes the render time much faster
        vtkDecimatePro* decimate = vtkDecimatePro::New();
        decimate->SetInputConnection(marching->GetOutputPort());
        decimate->SetTargetReduction(0.6);
        decimate->Update();

        returnedData = vtkPolyData::New();
        returnedData->DeepCopy(decimate->GetOutput());
        decimate->Delete();
    }
    else {
        marching->Update();
        returnedData = vtkPolyData::New();
        returnedData->DeepCopy(marching->GetOutput());
    }
    marching->Delete(); // Last line of my code before crash occurs
    return returnedData;
}

Stack Trace
  4a8bdc42()
  vtkCommon.dll!vtkGarbageCollectorImpl::CollectComponent(vtkGarbageCollectorImpl::ComponentType
* c=0x073d0c18)  Line 702 + 0x2b bytes C++
  vtkCommon.dll!vtkGarbageCollectorImpl::CollectInternal(vtkObjectBase *
root=0x07ac2dc8)  Line 476 C++
  vtkCommon.dll!vtkGarbageCollector::Collect(vtkObjectBase *
root=0x07ac2dc8)  Line 907 C++
  vtkCommon.dll!vtkObjectBase::UnRegisterInternal(vtkObjectBase *
__formal=0x00000000, int check=1)  Line 287 + 0x6 bytes C++
  vtkCommon.dll!vtkObject::UnRegisterInternal(vtkObjectBase * o=0x00000000,
int check=1)  Line 885 + 0x11 bytes C++
  vtkFiltering.dll!vtkAlgorithm::UnRegister(vtkObjectBase * o=0x00000000)
 Line 918 C++
  vtkCommon.dll!vtkObjectBase::Delete()  Line 128 C++
> MVSOrganizerQt.exe!vtkPipelines::getOrganMesh(vtkImageData * const
binaryImage=0x118a7190)  Line 507 + 0x9 bytes C++
  MVSOrganizerQt.exe!CreateOrganMeshThread::doOrganCreation()  Line 30 + 0x6
bytes C++
I'm getting very discouraged trying to fix all of these crashes.  Can anyone
suggest some reason for this?

If it matters, this is being called from a thread (although other crashes do
not occur in threads)

On Wed, Sep 7, 2011 at 4:40 PM, Xiaofeng Z <xf10036 at hotmail.com> wrote:

>  vtk doesn't use thread to do garbage collection.  You have too thread
> running vtk code and your crashes are most likely related to a race
> condition.
>
>
>
> ------------------------------
> Date: Wed, 7 Sep 2011 14:14:48 -0700
>
> Subject: Re: [vtkusers] Help with crashes in VTK
> From: jonmorra at gmail.com
> To: xf10036 at hotmail.com; david.gobbi at gmail.com
> CC: vtkusers at vtk.org
>
> So I was playing around with removing vtkSmartPointers passed by reference
> to see if that fixed my issue.
> 1.  Would passing a vtkSmartPointer by const reference be an issue?
> 2.  I got the following crash outlined below.  It does not reference any
> code I wrote at all.  Also in my debugger it says that there are 2 vtk
> garbage collection threads running.  My understanding of smart pointers is
> that a garbage collector is unnecessary because if the reference count = 0
> then the object is removed.  Also, what could cause this crash?
>
> Thread 1 stack trace
>   cccccccc()
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f280)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff5f4)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
> const char * desc=0x6490d51c)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6490d51c)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 1022 C++
>   vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 351 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f168)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff718)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
> const char * desc=0x6490cc14)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
> desc=0x6490cc14)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
> key=0x03ef5f78, vtkGarbageCollector * collector=0x179ffd90)  Line 826 + 0x16
> bytes C++
>   vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
> info=0x03f86bd8, vtkGarbageCollector * collector=0x179ffd90)  Line 136 C++
>   vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 812 + 0xc bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x0687f248)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff864)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
> const char * desc=0x6571055c)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6571055c)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector
> * collector=0x179ffd90)  Line 227 + 0x28 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983e58)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ff980)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
> const char * desc=0x64910f5c)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformationVector * & ptr=, const char *
> desc=0x64910f5c)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 306 + 0xf bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983c60)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ffa9c)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd5f44)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd5f44, const char * __formal=0x64910cac)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd5f44,
> const char * desc=0x64910cac)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x179ffd90, vtkObjectBase * & ptr=, const char *
> desc=0x64910cac)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
> collector=0x179ffd90, const char * desc=0x64910cac)  Line 96 + 0x10 bytes
> C++
>   vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
> info=0x03f84158, vtkGarbageCollector * collector=0x179ffd90)  Line 157 +
> 0x17 bytes C++
>   vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 812 + 0xc bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983d08)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x179ffbe0)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84158, void * ptr=0x04047464)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84158, void * ptr=0x04047464, const char * __formal=0x6490d504)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x179ffd90, vtkObjectBase * obj=0x03f84158, void * ptr=0x04047464,
> const char * desc=0x6490d504)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x179ffd90, vtkInformation * & ptr=, const char *
> desc=0x6490d504)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 1022 + 0xf bytes C++
>   vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x179ffd90)  Line 351 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06983b48)  Line 552 C++
> > vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x02fe0000)  Line 522 + 0x8 bytes C++
>   kernel32.dll!762214dd()
>   [Frames below may be incorrect and/or missing, no symbols loaded for
> kernel32.dll]
>   msvcr90.dll!73193c3a()
>   msvcr90.dll!731534c7()
>   kernel32.dll!7622339a()
>   ntdll.dll!76f69ed2()
>   ntdll.dll!76f69ea5()
>
> Thread 2 stack trace
>    vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06718db8)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff5f4)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f82880, void * ptr=0x04047640, const char * __formal=0x6490d51c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f82880, void * ptr=0x04047640,
> const char * desc=0x6490d51c)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6490d51c)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 1022 C++
>   vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 351 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06679c80)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff718)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x04047618, void * ptr=0x06bf9270, const char * __formal=0x6490cc14)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x04047618, void * ptr=0x06bf9270,
> const char * desc=0x6490cc14)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x17affd90, vtkObjectBase * & ptr=, const char *
> desc=0x6490cc14)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkInformation::ReportAsObjectBase(vtkInformationKey *
> key=0x03ef5f78, vtkGarbageCollector * collector=0x17affd90)  Line 826 + 0x16
> bytes C++
>   vtkCommon.dll!vtkInformationKey::ReportAsObjectBase(vtkInformation *
> info=0x03f86bd8, vtkGarbageCollector * collector=0x17affd90)  Line 136 C++
>   vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 812 + 0xc bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06679c10)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff864)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f86bd8, void * ptr=0x03f84698, const char * __formal=0x6571055c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f86bd8, void * ptr=0x03f84698,
> const char * desc=0x6571055c)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6571055c)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkInformationVector::ReportReferences(vtkGarbageCollector
> * collector=0x17affd90)  Line 227 + 0x28 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x06717548)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17aff980)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f85968, void * ptr=0x03c6bb08, const char * __formal=0x64910f5c)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f85968, void * ptr=0x03c6bb08,
> const char * desc=0x64910f5c)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformationVector>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformationVector * & ptr=, const char *
> desc=0x64910f5c)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkExecutive::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 306 + 0xf bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067174d8)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17affa9c)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd6624)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03c6bae0, void * ptr=0x03fd6624, const char * __formal=0x64910cac)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03c6bae0, void * ptr=0x03fd6624,
> const char * desc=0x64910cac)  Line 1069 C++
>   vtkCommon.dll!vtkGarbageCollectorReport<vtkObjectBase>(vtkGarbageCollector
> * collector=0x17affd90, vtkObjectBase * & ptr=, const char *
> desc=0x64910cac)  Line 201 + 0x17 bytes C++
>   vtkCommon.dll!vtkSmartPointerBase::Report(vtkGarbageCollector *
> collector=0x17affd90, const char * desc=0x64910cac)  Line 96 + 0x10 bytes
> C++
>   vtkFiltering.dll!vtkInformationExecutivePortKey::Report(vtkInformation *
> info=0x03f84b30, vtkGarbageCollector * collector=0x17affd90)  Line 157 +
> 0x17 bytes C++
>   vtkCommon.dll!vtkInformation::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 812 + 0xc bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067173f8)  Line 552 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x17affbe0)  Line 522 + 0x8 bytes C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84b30, void * ptr=0x04046ce4)  Line 639 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::Report(vtkObjectBase *
> obj=0x03f84b30, void * ptr=0x04046ce4, const char * __formal=0x6490d504)
>  Line 602 C++
>   vtkCommon.dll!vtkGarbageCollectorReportInternal(vtkGarbageCollector *
> collector=0x17affd90, vtkObjectBase * obj=0x03f84b30, void * ptr=0x04046ce4,
> const char * desc=0x6490d504)  Line 1069 C++
>   vtkFiltering.dll!vtkGarbageCollectorReport<vtkInformation>(vtkGarbageCollector
> * collector=0x17affd90, vtkInformation * & ptr=, const char *
> desc=0x6490d504)  Line 201 + 0x18 bytes C++
>   vtkFiltering.dll!vtkDataObject::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 1022 + 0xf bytes C++
>   vtkFiltering.dll!vtkPointSet::ReportReferences(vtkGarbageCollector *
> collector=0x17affd90)  Line 351 C++
>   vtkCommon.dll!vtkGarbageCollectorImpl::VisitTarjan(vtkObjectBase *
> obj=0x067175f0)  Line 552 C++
> > vtkCommon.dll!vtkGarbageCollectorImpl::MaybeVisit(vtkObjectBase *
> obj=0x00000000)  Line 522 + 0x8 bytes C++
>   QtGui4.dll!009284f2()
>   kernel32.dll!762214dd()
>   msvcr90.dll!73193c3a()
>   msvcr90.dll!731534c7()
>   kernel32.dll!7622339a()
>   ntdll.dll!76f69ed2()
>   ntdll.dll!76f69ea5()
>
>
> On Wed, Sep 7, 2011 at 9:45 AM, Xiaofeng Z <xf10036 at hotmail.com> wrote:
>
>  >I've been using vtkImageData::New(), followed by
> vtkImageData->DeepCopy(filter->GetOutput()).  I've been doing this cause I
> notice that once I delete the filter the output no longer exists.
>
> Don't deep copy the image, instead do:
>
>     vtkImageData* filterOutput = filter->GetOutput();
>     filterOutput->Register(0);    // increment the ref count
>
> to keep the output in the memory.
>
> Just make sure you pair off every New() or Register() with a Delete().
>
> BTW, I'm not for or against the use of smart pointer for any fundamental
> reason.  If one knows very well how a smart pointer class works, using
> the smart pointer to left the burden of tracking memory allocation can be
> very helpful.  When I do decided to use smart pointer, I use it exclusively,
> much like in Java where every variable is a managed smart pointer.  Mixing
> the usage of smart pointers and naked pointers is where trouble comes in.
>
> HTH
>
> On Tue, Sep 6, 2011 at 11:55 AM, David Gobbi <david.gobbi at gmail.com>wrote:
>
> On Tue, Sep 6, 2011 at 12:34 PM, Jonathan Morra <jonmorra at gmail.com>wrote:
>
> This could make sense, I'm going to try and change all my method signatures
> to pass around const references to vtkSmartPointers where appropriate.  Do
> you know what happens to the reference count upon returning a
> vtkSmartPointer?
>
>
>
> In VTK, smart pointers should only be used to store references, not to pass
> them.  VTK methods should take regular pointers as arguments.
>
> The general rules are:
>
> 1) Refcounts are not automatically incremented when objects are returned,
> i.e. when an object is returned to you, then you are just "borrowing" it.
>  If you need to own it for a while, then store it in a smart pointer.
>
> 2) Refcounts are not automatically incremented when objects are passed to a
> method.  If a method needs to own the object for a while, it should store it
> in a smart pointer.  All methods in the VTK libraries that need to own the
> objects that are passed to them will increment the refcount of those
> objects, either by storing it in a smart pointer or by calling Register() on
> it.
>
> There are a few very rare exceptions to rule #1, such as the NewInstance()
> method.
>
>  - David
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110908/aa2fa704/attachment.htm>


More information about the vtkusers mailing list