[vtkusers] Help with crashes in VTK

Jonathan Morra jonmorra at gmail.com
Wed Sep 7 17:14:48 EDT 2011


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/20110907/9357eb6c/attachment.htm>


More information about the vtkusers mailing list